相對委托,是比較好理解的。
涉及一個概念:函數簽名。函數簽名包括函數的名稱和參數,而函數重載:就是使用相同的名稱和不同的參數(參數類型、傳遞方式[傳值或引用])來實現的。而不能聲明相同的函數名稱和參數,但是不同的返回類型,這樣做并不是函數重載:因為函數簽名沒有包括其返回類型,所以這樣做實際相當于重復定義函數,肯定會報錯的。
static int MaxVal(int[] intArrayVal) { int maxVal = intArrayVal[0]; for (int i = 0; i < intArrayVal.Length; i++) { if (intArrayVal[i] > maxVal) { maxVal = intArrayVal[i]; } } return maxVal; } static double MaxVal(double[] doubleArrayVal) { double maxVal = doubleArrayVal[0]; for (int i = 0; i < doubleArrayVal.Length; i++) { if (doubleArrayVal[i] > maxVal) { maxVal = doubleArrayVal[i]; } } return maxVal; }
聲明兩個函數的版本(同名),在使用時,輸入函數名:MaxVal( 即可得到提示信息,可發現參數有兩種,只需要輸入相符類型的參數即可:
int[] myInt = { 1, 3, 4, 5 }; double[] myDouble = { 3.14, 3.15, 3.22, 3.01, 2.14 }; Console.WriteLine("myInt 最大值是 {0}", MaxVal(myInt)); Console.WriteLine("myDouble max value is: {0}", MaxVal(myDouble));
當然,重載還包括不同的參數類型(比如ref),可實現同一個函數,不同的傳值處理方式(被重載)。
在定義了委托后,就可以聲明該委托類型的變量。接著,把這個變量初始為與委托有相同返回類型和參數列表的函數引用。之后,就可以使用委托變量調用這個函數,就像變量是一個函數一樣。看個例子吧:
class PRogram { //定義委托:之后可聲明委托類型的變量; //初始化委托變量:可以初始化該變量為函數的引用,在初始化時需指定對應的函數名; //對這些函數有個要求:必須是返回類型、參數列表與委托相同的; //使用委托變量:在使用該委托變量時,用法和函數一樣(包括返回值); //思考?如果不用委托,判斷用戶輸入,再調用對應的函數,一樣可以達到效果…… //錯,重點是:可以把委托變量作為參數傳遞給一個函數,這樣,該函數就可以使用委托調用它引用的任何函數,而且在運行之前無需知道調用的是哪個函數。 delegate double ProcessDelegate(double param1, double param2); static double Multiply(double param1, double param2) { return param1 * param2; } static double Divide(double param1, double param2) { return param1 / param2; } static void Main(string[] args) { ProcessDelegate process; Console.WriteLine("請輸入兩個數,用逗號隔開:"); string input = Console.ReadLine(); int commaPos = input.IndexOf(','); //聲明初始化兩個double值,從上面獲取的數中轉換,用commaPos來判斷值的內容 double param1 = Convert.ToDouble(input.Substring(0,commaPos)); double param2 = Convert.ToDouble(input.Substring(commaPos + 1, input.Length - commaPos - 1)); Console.WriteLine("輸入 M 執行 相乘 或者輸入 D 執行 相除 操作:"); input = Console.ReadLine(); if (input == "m") //初始化委托變量,指定委托類型(上面建的ProcessDelegate),并提供一個引用函數的參數, //這是委托賦值的一種語法,在括號中,指定相應的函數名(不帶括號); //還有簡單的用法,process = Multiply; //編譯器會自動匹配委托變量與函數的返回類型和參數,不匹配,應該會報錯; process = new ProcessDelegate(Multiply); else process = new ProcessDelegate(Divide); Console.WriteLine("根據你的選擇,委托在實例化的時候,調用不同的函數;"); Console.WriteLine("并且,在這一步傳遞對應的參數給委托(委托交給函數),計算的結果:{0}", process(param1, param2)); Console.ReadKey(); } }
重點是:可以把委托變量作為參數傳遞給一個函數,這樣,這個函數就可以使用委托調用它引用的任何函數,而且在運行之前無需知道調用的是哪個函數。
之前看同事演示過項目中運用到的委托機制,雖然這兒把原理搞清楚了,但是深入的使用仍然很模糊,不過據說要等到13章介紹到與事件處理相關的內容時才更容易理解。
終于把這一篇比較重要的內容看完了,不過,沒有系統化的做出案例,仍然不能說是掌握了。
新聞熱點
疑難解答