- C#入門經典(第7版):C# 6.0 & Visual Studio 2015(.NET開發經典名著)
- (美)Beijamin Perkins Jacob Vibe Hammer Jon D. Reid
- 780字
- 2021-04-02 21:18:39
6.5 函數的重載
本章前面提到過,在調用函數時,必須匹配函數的簽名。這表明,需要有不同的函數操作不同類型的變量。函數重載允許創建多個同名函數,每個函數可使用不同的參數類型。例如,前面使用了下述代碼,其中包含函數MaxValue():
class Program { static int MaxValue(int[] intArray) { int maxVal = intArray[0]; for (int i = 1; i < intArray.Length; i++) { if (intArray[i] > maxVal) maxVal = intArray[i]; } return maxVal; } static void Main(string[] args) { int[] myArray = { 1, 8, 3, 6, 2, 5, 9, 3, 0, 2 }; int maxVal = MaxValue(myArray); WriteLine($"The maximum value in myArray is {maxVal}"); ReadKey(); } }
這個函數只能用于處理int數組。可為不同的參數類型提供不同名稱的函數,例如把上述函數重命名為IntArrayMaxValue(),添加諸如DoubleArrayMaxValue()的函數來處理其他類型。還有一種方法,即在代碼中添加如下函數:
static double MaxValue(double[] doubleArray) { double maxVal = doubleArray[0]; for (int i = 1; i < doubleArray.Length; i++) { if (doubleArray[i] > maxVal) maxVal = doubleArray[i]; } return maxVal; }
這里的區別是使用了double值。函數名稱MaxValue()是相同的,但其簽名是不同的。這是因為如前所述,函數的簽名包含函數的名稱及其參數。用相同簽名來定義兩個函數是錯誤的,但因為這里的兩個函數的簽名不同,所以沒有問題。
注意:函數的返回類型不是其簽名的一部分,所以不能定義兩個僅返回類型不同的函數,它們實際上有相同的簽名。
添加了前面的代碼后,現在有兩個版本的MaxValue(),它們的參數是int和double數組,分別返回int或double類型的最大值。
這種代碼的優點是不必顯式地指定要使用哪個函數。只需提供一個數組參數,就可以根據使用的參數類型執行相應的函數。
此時,應注意VS中IntelliSense的另一項功能。如果在應用程序中有上述兩個函數,而且要在Main()或其他函數中鍵入函數的名稱,IDE就可以顯示出可用的重載函數。如果鍵入下面的代碼:
double result = MaxValue(
IDE就會提供兩個MaxValue()版本的信息,可使用上下箭頭鍵在其間滾動,如圖6-9所示。

圖6-9
在重載函數時,應包括函數簽名的所有方面。例如,有兩個不同函數,它們分別帶有值參數和引用參數:
static void ShowDouble(ref int val) { ... } static void ShowDouble(int val) { ... }
選用哪個版本完全根據函數調用是否包含ref關鍵字來確定。下面的代碼將調用引用版本:
ShowDouble(ref val);
下面的代碼調用值版本:
ShowDouble(val);
此外,還可以根據參數的個數等來區分函數。