設計方法的參數是,可以將部分參數和全部參數分配默認值,然后調用這些方法的時候可以選擇不提供部分實參,使用參數定義的默認值,另外,還可以在調用方法的時候通過指定參數名稱來傳遞實參。
例如:
public static class Program{ private static int32 s=0; private static void Mothed(int32 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); } public static void Main(){ Mothed();//等同於Mothed(9,"A",default(Datetime),new Guid()) Mothed(8,"X");//等同於Mothed(8,"X",default(Datetime),new Guid()) Mothed(5,guid:Guid.NewGuid(),dt:DateTime.Now);//等同於Mothed(5,"A",DateTime.Now,Guid.NewGuid()) Mothed(s_n++,s_n++.ToString());//等同於Mothed(0,"1",default(Datetime),new Guid()); Mothed(s:(s_n++).ToString(),x:s_n++);//等同於一下兩行代碼:string t1="2";int32 t2=3; Mothed(t2,t1,default(Datetime),new Guid()) } }
向方法傳遞實參時,編譯器從左到右的順序對實參進行求值。在對Mothed的第四個調用中s_n的當前默認值是0,先遞增然后等於1傳遞給s,然后繼續遞增到2(s_n++先使用后遞增)。
定義實參的規則和原則:
一、可為方法、構造器方法和有參屬性(C#索引器)的參數指定默認值。還可以為屬於委托定義一部分的參數指定默認值。以后調用該委托類型的變量時可省略實參來使用默認值。
二、有默認值的參數必須放在沒有默認值的所有參數之后(重中之重)。但也有例外:參數數組這種參數必須放在所有參數(包括默認值得這些)之后,而且數組本身不能有一個默認值。
三、默認值必須是編譯時能確定的常量值。(即C#認定的基元類型--不懂基元類型下次解釋)值類型的參數可以將默認值設為值類型的實例,並讓他的所有字段都包含零,可以使用default關鍵字或者new關鍵字來表達這個意思。
四、不要重命名參數變量,否則任何調用者以以傳參數名的方式傳遞實參,他們的代碼必須修改。
五、如果方法在模塊外部調用,更改參數的默認值具有潛在的危險性。
六、如果參數使用ref或者out關鍵字進行標識,就不能設置默認值。因為沒有辦法為這些參數傳遞有意義的參數值,類似指針。
注意:如果參數要求ref/out,為了能傳參數名的方式傳遞實參,可以按照下面語法進行:
//方法聲明 private static void M(ref Int32 x){...} //方法調用 Int32 a=5; M(x:ref a);
同時:
實參可按照任意順序傳遞,但命名實參必須且只能出現在實參列表尾部,如上述代碼第三種調用方式。
可以按照名稱將實參傳遞給沒有默認值的參數。但所有必須的實參都必須傳遞(無論按照位置還是按照名稱),編譯器才能編譯代碼
C#不允許省略逗號之間的實參,比如M(1,,DateTime.New).因為這樣會造成可讀性的影響,程序員將被迫去讀 逗號,對於沒有默認值的參數,如果想省略它們的實參,以傳參數名的方式傳遞實參即可。