標籤:委託方 ges 多個 技術分享 限制 數組 其他 add 最大
一、委託
把方法作為參數傳給其他方法;
二、聲明委託
在C#中使用一個類時,分兩個階段。首先,需要去定義一個類,然後執行個體化類的一個對象(只需要靜態方法除外)。 使用委託也需要經過這2個步驟,首先必須定義要使用的委託,對於委託,定義它就是告訴編譯器這種類型的委託表示哪種類型的方法。然後,必須建立該委託的一個或多個執行個體。編譯器在後台將建立表示該委託的一個類。定義委託的文法如下:
delegate void IntMethodInvoker(int x);
在這個樣本中,定義了一個委託IntMethodInvoker,並指定該委託的每個執行個體都可以包含一個方法的引用,該方法帶有一個int參數,並返回void。理解委託的一個要點就是他們的型別安全非常高。在定義委託時,必須給出它所表示的方法的簽名和傳回型別等全部細節;
假設要定義一個委託,該委託表示的方法包含有兩個decimal型的參數,傳回型別為decimal;
delegate decimal MethodInvoker(decimal x, decimal y);
三、使用委託
首先定義好委託,然後建立該委託的一個或多個執行個體;假設我要使用上面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個值中最大一個值,運行上面代碼可以得到如下結果:
如果MethodInvoker委託,只是想得到2個參數進行一系列操作後返回一個結果。上面的結構就不能滿足這個需求,因為已經限制好了參數類型和傳回型別。說到這,對泛型熟悉的朋友就應該知道,如果採用泛型去聲明該委託,就可以解決這個問題了。我們就接著上面的代碼改造:
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個參數進行操作後得到一個返回結果;
四、簡單委託樣本
定義一個簡單的資料操作類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委託的數組,然後遍曆這個數組,然後執行其中的不同返回,得到的結果如下:
五、為什麼要使用委託
使用委託使程式員可以將方法引用封裝在委派物件內。然後可以將該委派物件傳遞給可調用所引用方法的代碼,而不必在編譯時間知道將調用哪個方法。與C或C++中的函數指標不同,委託是物件導向,而且是型別安全的。
C#中的委託(一)