1、委託程序員
把方法做爲參數傳給其餘方法;數組
2、聲明委託安全
在C#中使用一個類時,分兩個階段。首先,須要去定義一個類,而後實例化類的一個對象(只須要靜態方法除外)。 使用委託也須要通過這2個步驟,首先必須定義要使用的委託,對於委託,定義它就是告訴編譯器這種類型的委託表示哪一種類型的方法。而後,必須建立該委託的一個或多個實例。編譯器在後臺將建立表示該委託的一個類。定義委託的語法以下:函數
delegate void IntMethodInvoker(int x);
在這個示例中,定義了一個委託IntMethodInvoker,並指定該委託的每一個實例均可以包含一個方法的引用,該方法帶有一個int參數,並返回void。理解委託的一個要點就是他們的類型安全性很是高。在定義委託時,必須給出它所表示的方法的簽名和返回類型等所有細節;spa
假設要定義一個委託,該委託表示的方法包含有兩個decimal型的參數,返回類型爲decimal;指針
delegate decimal MethodInvoker(decimal x, decimal y);
3、使用委託code
首先定義好委託,而後建立該委託的一個或多個實例;假設我要使用上面MethodInvoker的話,代碼以下:對象
MethodInvoker invoker = new MethodInvoker(Math.Max); decimal x = invoker(5.20m, 5.21m); Console.WriteLine("x:" + x);
在這裏咱們把Math.Max(decimal val1,decimal val2) 返回傳給了委託;得出2個值中最大一個值,運行上面代碼能夠獲得以下結果:blog
若是MethodInvoker委託,只是想獲得2個參數進行一系列操做後返回一個結果。上面的結構就不能知足這個需求,由於已經限制好了參數類型和返回類型。說到這,對泛型熟悉的朋友就應該知道,若是採用泛型去聲明該委託,就能夠解決這個問題了。咱們就接着上面的代碼改造:ci
delegate T MethodInvoker<T>(T x1, T x2); MethodInvoker<decimal> invoker = new MethodInvoker<decimal>(Math.Max); decimal x = invoker(5.20m, 5.21m); Console.WriteLine("x:" + x); Console.ReadLine(); MethodInvoker<double> invoker1 = new MethodInvoker<double>(Math.Pow); double x1 = invoker1(10, 3); Console.WriteLine("x:" + x1);
輸出結果:
參與泛型的方式聲明委託後就能夠知足輸入2個參數進行操做後獲得一個返回結果;
4、簡單委託示例
定義一個簡單的數據操做類MathOperation,添加2個靜態方法Add(int,int)、Reduce(int,int),兩個方法都返回int類型,代碼以下:
public class MathOperation { public int Add(int x, int y) { return x + y; } public int Reduce(int x, int y) { return x - y; } }
下面調用這些方法:
delegate int MathOperDelegate(int x, int y); MathOperDelegate[] operation = { MathOperation.Add, MathOperation.Reduce }; for (int i = 0; i < operation.Length; i++) { Console.WriteLine("執行第{0}個委託方法", i); for (int j = 1; j < 10; j++) { Console.WriteLine("執行結果爲:{0}", operation[i](i, j)); Thread.Sleep(20); } }
在這段代碼中,實例化了一個MethodDelegate委託的數組,而後遍歷這個數組,而後執行其中的不一樣返回,獲得的結果以下:
5、爲何要使用委託
使用委託使程序員能夠將方法引用封裝在委託對象內。而後能夠將該委託對象傳遞給可調用所引用方法的代碼,而沒必要在編譯時知道將調用哪一個方法。與C或C++中的函數指針不一樣,委託是面向對象,並且是類型安全的。