委託是一個類。
namespace ConsoleApplication1
{internal delegate void MyDelegate(int val);class Program
{static void Main(string[] args){}}}
使用Reflector檢視委託的IL程式碼:
○ 委託的確是一個類
○ 委託的建構函式接收方法和類例項
○ 而且是多播委託,可以用+=為委託變數賦值
○ 委託內部使用Invoke方法觸發方法
○ BeginInvoke和EndInvoke方法用於多執行緒場景
接下來體驗委託如何使用,以及委託的Method和Target屬性分別代表什麼。
namespace ConsoleApplication1
{internal delegate void MyDelegate(int val);class Program
{static void Main(string[] args){//委託與靜態方法
MyDelegate d = new MyDelegate(M1);
d(10);Console.WriteLine(d.Method);if (d.Target == null){Console.WriteLine("當前委託呼叫的是靜態方法,沒有類例項");
}else
{Console.WriteLine("當前委託呼叫的是例項方法,類例項為:" + d.Target);
}Console.WriteLine("-------------------");
//委託與例項方法
Program p = new Program();
d = p.M2;d.Invoke(10);Console.WriteLine(d.Method);if (d.Target == null){Console.WriteLine("當前委託呼叫的是靜態方法,沒有類例項");
}else
{Console.WriteLine("當前委託呼叫的是例項方法,類例項為:" + d.Target);
}}static void M1(int val){Console.WriteLine("我是靜態方法,輸出" + val);
}void M2(int val){Console.WriteLine("我是例項方法,輸出" + val);
}}}
○ 委託建立:通過委託建構函式,new MyDelegate(M1);也可通過d = p.M2,這是一種"語法糖"寫法,其內部也呼叫了委託建構函式。
○ 委託與靜態方法:只要兩者引數列表和返回型別一致,可把靜態方法傳給委託建構函式
○ 委託與例項方法:只要兩者引數列表和返回型別一致,可把例項方法傳給委託建構函式
○ 委託呼叫:像d.Invoke(10),通過委託的例項方法Invoke呼叫;像d(10),這是一種"語法糖"寫法,其內部也呼叫了例項方法Invoke。
○ Target屬性:委託所表示例項方法所屬的類例項名稱,如果是靜態方法,Target為null
○ Method屬性:委託所表示的方法,可能是靜態方法,也有可能是例項方法
“委託、Lambda表示式、事件系列”包括: