重載,是指在相同的作用域內,聲明多個同名的方法。用以對不同類型或數量的參數的參數執行相同的操作。比如,可以求兩個或者三個 int類型數中的最大值,我們可以編寫這樣的方法實現:
class Util { public static int Max(int num1,int num2) { return (num1>num2||num1=num2)?num1:num2; } public static int Max(int num1,int num2,int num3) { int max=num1; if(max<num2) max=num2; if(max<num3) max=num3; return max; } }
顯然,當參數數目不確定的時候,重載不是一個好的解決辦法,這時候,可以使用數組作為參數傳入。以上面的問題為例:
class Util { public static int Max(int[] paramList) { if(paramList==null||paramList.length==0) { throw new ArgumentException("Util.Max:參數值數量不足"); } int currentMax=paramList[0]; foreach(int i in paramList) { if(currentMax<i) { currentMax=i; } } return currentMax; } }
為了使用Max方法判斷2個int值得最小值,可以像下面這么寫:
int[] array=new int[2]; array[0]=first; array[1]=second; int max=Util.Max(array);
為了使用Max方法判斷2個int值得最小值,可以像下面這么寫:
int[] array=new int[3]; array[0]=first; array[1]=second; array[2]=third; int max=Util.Max(array);
雖然上面的辦法避免了大量的重載,但是額外多了很多代碼來填充數組,但是如果用 params 關鍵字來聲明一個params數組,一切就OK了,還是用上面的例子,用法如下:
class Util { public static int Max(params int[] paramList) { if(paramList==null||paramList.length==0) { throw new ArgumentException("Util.Max:參數值數量不足"); } int currentMax=paramList[0]; foreach(int i in paramList) { if(currentMax<i) { currentMax=i; } } return currentMax; } }
這時候如果要求四個int類型的數中的最大值,方法為: Util.Max(first,second,third,fourth);
編譯器會自動完成填充數組的過程,再將數組的作為參數傳遞進去。
那么,對於類型不同的參數,同樣可以使用 params object[]
關於params數組,要注意一下幾點:
1、只能為一位數組使用 params 關鍵字,不能為多為數組使用,否則編譯不能通過。
2、不能只依賴 params 關鍵字來重載一個方法。 params 關鍵字不構成方法簽名的一部分,例如:
//編譯時錯誤:重復的聲明 public static int Max(int[] paramList) ... public static int Max(params int[] paramList) ...
3、不允許為 params 數組指定 ref 或 out修飾符。
4、params 數組必須是方法的最后一個參數,沒個方法中也只能有一個 params 數組參數。
//編譯時錯誤 public static int Max(params int[] paramList,int i) ...
5、非params方法優先
public static int Max(int first,int second) ... public static int Max(params int[] paramList) ...
對於上面的重載方法,傳入兩個 int 參數時,調用上面的方法,傳入其它任意數量的 int 參數時,調用下面的方法。這樣做並非多余,實則起到優化作用。
6、有歧義的重載編譯不能通過。
//編譯時錯誤 public static int Max(params int[] paramList) ... public static int Max(int i, params int[] paramList) ...
如上,程序無法分辨調用哪一個方法。