標籤:style blog color 使用 width io
委託在c# 1 時代產生出來的時候,估計無人可以預想到會對C#語言產生如此大的影響。c#1 要建立委託執行個體。必須指定委託的類型和操作。
c# 2.0 時代加入了文法糖 += ,-=構建鏈式委託.同時支援委託的協變與逆變。
方法群組轉換:
方法組就是重載方法。方法組可以隱式轉換為相容的委託。
public delegate void EventHandler(object o,EventArgs e); public TestMethod(){} public TestMethod(object o,EventArgs e){} EventHandler h=TestMethod;
不過 方法組不能隱式的轉換Delegate, 顯示轉換如下
Delegate d = (EventHandler)TestMethod
並且對於已經重載轉換委託類型的方法,就不能把它作為方法參數使用,下面的 就會出現錯 參數 1: 無法從“方法組”轉換為“System.Delegate”
public delegate void EventHandler(object o, EventArgs e); public static void TestMehod(object o, EventArgs e) { } public static void TestMethodt(Delegate d) { } TestMethodt(TestMehod);
採用強制轉型 TestMethodt((EventHandler)TestMehod);
委託匿名方法轉換
匿名方法轉換 在ECMA 344 13.5
1.無傳回型別參數匹配
Action<int> s = delegate{ };
Action<int> a = delegate(int x) { };
3.匿名方法閉包:
閉包 抓取的是就是變數本身。如下的兩種情況。對於counter來說List中抓的都是新的執行個體。對於i所有的list都是同一個變數
List<Action> lst = new List<Action>(); for (int i=0;i<3;++i) { int counter = i*10; lst.Add(delegate { Console.WriteLine("values is "+i); i++; }); } foreach (var t in lst) { t(); } lst[0](); lst[0](); lst[2](); lst[2]();
List<Action> lst = new List<Action>(); for (int i=0;i<3;++i) { int counter = i*10; lst.Add(delegate { Console.WriteLine("values is " + counter); counter++; }); } foreach (var t in lst) { t(); } lst[0](); lst[0](); lst[2](); lst[2]();