一、匿名類型
可通過使用 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 //多參數,隱式類型=> 表達式