設計一個方法的參數時,可部分或全部參數分配默認值。然後,調用這些方法的代碼可以選擇不指定部分實參,接受其默認值。
此外,調用方法時還可以通過指定參數名稱的方式為其傳遞實參。
演示代碼如下:
public static class program { private static int sn = 0; private static void M(int x = 9, string s = "A", DateTime dt = default(DateTime), Guid guid = new Guid()) { Console.WriteLine("x={0},s={1},dt={2},guid={3}", x, s, dt, guid); } static void Main(string[] args) { M();//全部顯示默認值 M(8, "X"); M(5,guid:Guid.NewGuid(),dt:DateTime.Now);//guid,dt為指定的參數名稱 M(sn++,sn++.ToString());//這裡結果為x = 0, s = 1是因為sn++先執行後進行了+1運算,這個M方法結束後sn為2
M(s:(sn++.ToString()),x:sn++); Console.ReadKey();
}
}
//輸出結果依次為: //x=9,s=A,dt=0001/1/1 星期一 0:00:00,guid=00000000-0000-0000-0000-000000000000 //x=8,s=X,dt=0001/1/1 星期一 0:00:00,guid=00000000-0000-0000-0000-000000000000 //x=5,s=A,dt=2017/1/12 星期四 8:55:47,guid=6387f914-cd37-4aa8-a144-2524e4972a44 //x = 0, s = 1, dt = 0001 / 1 / 1 星期一 0:00:00,guid=00000000-0000-0000-0000-000000000000 //x=3,s=2,dt=0001/1/1 星期一 0:00:00,guid=00000000-0000-0000-0000-000000000000
在定義的方法中,如果為部分參數指定了默認值,注意以下額外的規則和原則:
1.可以為方法、構造器方法和有參屬性(c#索引器)的參數指定默認值。還可以為屬於委托定義的一部分的參數指定默認值。然後在調用該委托的一個變量時,可以省略實參,以接受默認值。
2.有默認值的參數必須放在沒有默認值的參數之後(左邊),例如上面string s沒有默認值則出現變異錯誤。"參數數組"除外,這種參數放在所有參數之後,而數組本身不能有默認值。
3.默認值必須是編譯時能確定的常量值。c#認定的基元類型,枚舉類,以及能設為null的任何引用類型可設為默認值。對於任何值類型的參數,可將默認值設為值類型的一個實例,並讓它
的所有字段都包含零值。可用default和new來表達這個意思。(如上例dt,guid)
4.不要重命名參數變量。否則,任何調用這如果以傳參數名的方式傳參都必須修改他們的代碼。
5.如果方法是從模塊的外部調用,更改參數的默認值具有潛在危險性。
6.如果參數用ref或者out關鍵字標識,就不能設置默認值,因為沒有辦法為這些參數傳遞一個有意義的默認值。
使用可選或命名參數調用一個方法時,還有以下額外規則:
1、實參可按任何順序傳遞,但是,命名實參只能在參數列表最後。
2、可按名稱將實參傳給沒有默認值的參數。但是,所有要求的實參都必須傳遞(按位置或按名稱)
3、c#不允許省略逗號之間的實參。
如果參數需要ref/out,為了以傳參數值的方法傳遞實參,使用下面的語法:
//方法聲明
private static void M(ref int x){...}
//方法調用
int=5;
M(x:ref a);