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