C# 匿名委托、匿名方法、匿名對象、Lambda表達式


一、匿名類型
可通過使用 new 運算符和對象初始值創建匿名類型。
示例:
var v = new { Name = "Micro", Message = "Hello" };
var v = new[] {
    new { Name = "Micro", Message = "Hello" },
    new { Name = "Soft", Message = "Wold!" }
};
匿名類型通常用在查詢表達式的 select 子句中,以便返回源序列中每個對象的屬性子集。
var Query = from p in v select new { p.Name };
foreach (var o in Query)
{
    Console.WriteLine(o.Name);
}
可以查找對象
IEnumerable<v> results = people.Where(delegate(v p) { return p.Name == "Micro"; });

二、匿名方法
要將代碼塊傳遞為委托參數 例如:
點擊事件
button1.Click += delegate(System.Object o, System.EventArgs e)
{
    System.Console.WriteLine("Hello");
};
this.Loaded += delegate
{
    InitializeEvent();
};

加載事件
this.Loaded += (sl, el) =>
{
    System.Console.WriteLine("Hello");
    this.button1.Click += (sender, e) =>
    {
        System.Console.WriteLine("Wold!");
    }
}

匿名方法與線程
System.Threading.Thread thread = new System.Threading.Thread(delegate(j)
{
    System.Console.WriteLine("Hello");
});
thread.Start();

System.Threading.ThreadPool.QueueUserWorkItem((s) =>
{
    Action f = () =>
    {
        System.Console.WriteLine("Wold!");
    };
}

使委托與匿名方法關聯
delegate void DEL(string s);
private void Window_Loaded(object sender, RoutedEventArgs e)
{
    DEL p = delegate(string j)
    {
        System.Console.WriteLine(j);
    };
    p("Hello");
}

三、Func,Func是有返回值的泛型委托
Func<int> 表示無參,返回值為int的委托
Func<object,string,int> 表示傳入參數為object, string 返回值為int的委托
Func<object,string,int> 表示傳入參數為object, string 返回值為int的委托
Func<T1,T2,,T3,int> 表示傳入參數為T1,T2,,T3(泛型)返回值為int的委托
Func至少0個參數,至多16個參數,根據返回值泛型返回。必須有返回值,不可void

匿名方法只能在使用委托的時候創建,事實上,它們通過delegate關鍵字創建。
使用示例:
var func = new Func<bool, int>(delegate(bool x) { return x ? 10 : 5; });
int ret = func(true);

四、匿名事件
btn.Click += delegate(object o, EventArgs e) {  };

五、Lambda 表達式,Func<T>委托
MSDN中寫道:“Lambda 表達式”是一個匿名函數,它可以包含表達式和語句,並且可用於創建委托或表達式樹類型。
所有Lambda表達式都使用Lambda運算符=>
左邊是輸入參數列表
1.一個參數:param=>expr
2.多個參數:(param-list)=>expr

右邊是表達式或語句塊
(參數列表)=>表達式或語句塊

合法的Lambda表達式
1、(x, y) => x * y                    //多參數,隱式類型=> 表達式  
2、x => x * 5                        //單參數, 隱式類型=>表達式  
3、x => { return x * 5; }            //單參數,隱式類型=>語句塊  
4、(int x) => x * 5                    //單參數,顯式類型=>表達式  
5、(int x) => { return x * 5; }     //單參數,顯式類型=>語句塊  
6、() => Console.WriteLine()        //無參數

在編寫Lambda表達式時,可以忽略參數的類型,因為編譯器能夠根據上下文直接推斷參數的類型,示例代碼如下。
(x, y) => x + y                        //多參數,隱式類型=> 表達式


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM