委託、Lambda表示式、事件系列01,委託是什麼,委託的基本用法,委託的Method和Target屬性

Darren Ji發表於2014-10-01

委託是一個類。

namespace ConsoleApplication1
{
    internal delegate void MyDelegate(int val);
    class Program
    {
        static void Main(string[] args)
        {
        }
    }
}

使用Reflector檢視委託的IL程式碼:
1
○ 委託的確是一個類
○ 委託的建構函式接收方法和類例項
○ 而且是多播委託,可以用+=為委託變數賦值
○ 委託內部使用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);
        }
    }
}

2

○ 委託建立:通過委託建構函式,new MyDelegate(M1);也可通過d = p.M2,這是一種"語法糖"寫法,其內部也呼叫了委託建構函式。
○ 委託與靜態方法:只要兩者引數列表和返回型別一致,可把靜態方法傳給委託建構函式
○ 委託與例項方法:只要兩者引數列表和返回型別一致,可把例項方法傳給委託建構函式
○ 委託呼叫:像d.Invoke(10),通過委託的例項方法Invoke呼叫;像d(10),這是一種"語法糖"寫法,其內部也呼叫了例項方法Invoke。
○ Target屬性:委託所表示例項方法所屬的類例項名稱,如果是靜態方法,Target為null
○ Method屬性:委託所表示的方法,可能是靜態方法,也有可能是例項方法

 

 

“委託、Lambda表示式、事件系列”包括:

委託、Lambda表示式、事件系列01,委託是什麼,委託的基本用法,委託的Method和Target屬性

委託、Lambda表示式、事件系列02,什麼時候該用委託

委託、Lambda表示式、事件系列03,從委託到Lamda表示式

委託、Lambda表示式、事件系列04,委託鏈是怎樣形成的, 多播委託, 呼叫委託鏈方法,委託鏈異常處理

委託、Lambda表示式、事件系列05,Action委託與閉包

委託、Lambda表示式、事件系列06,使用Action實現觀察者模式,體驗委託和事件的區別

委託、Lambda表示式、事件系列07,使用EventHandler委託

相關文章