主要適用范圍。 1、常規實現 復制代碼 private delegate String getAString(); static void Main(String []args) { int temp = 40; getAString stringMethod = new getAString(temp.ToString); Console.WriteLine("String is {0}", stringMethod());//這裡stringMethod()等價於調用temp.ToString(); Console.ReadLine(); } 復制代碼 這段代碼中,實例化了類型為GetAString的一個委托,並對它進行初始化,使它引用整型變量temp的ToString()方法。在C#中,委托在語法上總是接受一個參數的構造函數,這個參數就是委托引用的方法。上例中stringMethod()等價於使用temp.ToString(),同時也與調用委托類的Invoke()方法完全相同,實際上,如下圖IL代碼中紅色部分所示,C#編譯器會用stringMethod.Invoke()代替stringMethod()。 032104 為了簡便輸入,C#支持只傳送地址的名稱給委托的實例(委托推斷),如下兩行代碼在編譯器看來是一樣的。 getAString stringMethod = new getAString(temp.ToString); getAString stringMethod = temp.ToString; 實際上委托的實例可以引用任何類型的任何對象上的實例方法或靜態方法,只要方法的簽名匹配於委托的簽名即可。所以結構體的方法一樣可以傳遞給委托。 2、多播委托 多播委托具有一個帶有鏈接的委托列表,稱為調用列表,在對委托實例進行調用的時候,將按列表中的委托順序進行同步調用。如果委托有返回值,則將列表中最後一個方法的返回值用作整個委托調用的返回值。因此,使用多播委托通常具有void返回類型。 可以使用+=來使委托指向多個方法的地址,但必須是在委托實例化之後才可以使用+=來添加新的方法地址(添加重復的方法地址編譯器不會報錯,但是也不會重復執行),若想移除其中的方法地址可以使用-=來實現(需要至少保留一個,即對於最後一個方法地址的移除不起作用)。以下代碼中下面兩行無論單獨保留哪行,最終的執行結果都是相同的。 getAString stringMethod = new getAString(temp.ToString); stringMethod += temp.ToString; stringMethod -= temp.ToString; 3、委托數組 復制代碼 delegate double Operations(double x); class Program { static void Main() { Operations[] operations = { MathOperations.MultiplyByTwo, MathOperations.Square }; for (int i = 0; i < operations.Length; i++) { Console.WriteLine("Using operations[{0}]:", i); DisplayNumber(operations[i], 2.0); DisplayNumber(operations[i], 7.94); Console.ReadLine(); } } static void DisplayNumber(Operations action, double value) { double result = action(value); Console.WriteLine( "Input Value is {0}, result of operation is {1}", value, result); } } struct MathOperations { public static double MultiplyByTwo(double value) { return value * 2; } public static double Square(double value) { return value * value; } } 復制代碼 上述代碼中實例化了一個委托數組operations(與處理類的實例相同),該數組的元素初始化為MathOperations類的不同操作,遍歷這個數組,可以將每個操作應用到2個不同的值中。這種用法的好處是,可以在循環中調用不同的方法。 (不早了,今天先寫到這,下一篇接著寫委托的實現方式。)