C# 函數(shù)的重載
在調(diào)用函數(shù)時(shí),必須匹配函數(shù)的簽名。這表明,需要有不同的函數(shù)來操作不同類型的變量。函數(shù)重載允許創(chuàng)建多個(gè)同名函數(shù),每個(gè)函數(shù)可使用不同的參數(shù)類型。例如,前面使用了下述代碼,其中包含函數(shù) MaxValueO:
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, 0, 2 );
int maxVal = MaxValue(myArray);
WriteLine("The maximum value in myArray is {maxVal}");
ReadKey();
}
}
這個(gè)函數(shù)只能用于處理int數(shù)組??蔀椴煌膮?shù)類型提供不同名稱的函數(shù),例如把上述函數(shù)重命名為IntArrayMaxValue(),并添加諸如DoubleArrayMaxValue()的函數(shù)來處理其他類型。還有一種方法,即在代碼中添加如下函數(shù):
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;
}
這里的區(qū)別是使用了double值。函數(shù)名稱MaxValueO是相同的,但其簽名是不同的。這是因?yàn)槿缜八觯瘮?shù)的簽名包含函數(shù)的名稱及其參數(shù)。用相同簽名來定義兩個(gè)函數(shù)是錯(cuò)誤的,但因?yàn)檫@里的兩個(gè)函數(shù)的簽名不同,所以沒有問題。
添加了前面的代碼后,現(xiàn)在有兩個(gè)版本的MaxValue(),它們的參數(shù)是int和double數(shù)組,分別返回int或double類型的最大值。
這種代碼的優(yōu)點(diǎn)是不必顯式地指定要使用哪個(gè)函數(shù)。只需要提供一個(gè)數(shù)組參數(shù),就可以根據(jù)使用的參數(shù)類型執(zhí)行相應(yīng)的函數(shù)。
此時(shí),應(yīng)注意Visual Studio中IntelliSense的另一項(xiàng)功能。如果在應(yīng)用程序中有上述兩個(gè)函數(shù),而且要在MainG或其他函數(shù)中鍵入函數(shù)的名稱,IDE就可以顯示出可用的重載函數(shù)。如果鍵入下面的代碼:
double result = MaxValue(
IDE會(huì)提供兩個(gè)MaxValueO版本的信息,可使用上下箭頭鍵在其間滾動(dòng),如圖所示。
在重載函數(shù)時(shí),應(yīng)包括函數(shù)簽名的所有方面。例如,有兩個(gè)不同的涵數(shù),它們分別帶有值參數(shù)和引用參數(shù):
static void ShowDouble(ref int val)
{
…
{
static void ShowDouble(int val)
{
…
}
選用哪個(gè)版本完全根據(jù)函數(shù)調(diào)用是否包含ref關(guān)鍵字來確定。下面的代碼將調(diào)用引用版本:
ShowDouble(ref val);
下面的代碼將調(diào)用值版本:
ShowDouble(val);
此外,還可以根據(jù)參數(shù)的個(gè)數(shù)等來區(qū)分函數(shù)。
點(diǎn)擊加載更多評(píng)論>>