本篇文章為大家展示了可選參數(shù)和命名參數(shù)的教程,代碼簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
創(chuàng)新互聯(lián)主營陳巴爾虎網(wǎng)站建設的網(wǎng)絡公司,主營網(wǎng)站建設方案,成都APP應用開發(fā),陳巴爾虎h5小程序制作搭建,陳巴爾虎網(wǎng)站營銷推廣歡迎陳巴爾虎等地區(qū)企業(yè)咨詢class Program { private static int s_n = 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); } public static void Main() { //1.等同于M(9,"A",default(DateTime),new Guid()); M(); //2.等同于M(8,"X",default(DateTime),new Guid()); M(8, "X"); //3.等同于M(5,"A",DateTime.Now,Guid.NewGuid()); M(5, guid: Guid.NewGuid(), dt: DateTime.Now); //4.等同于M(0,"1",default(DateTime),new Guid()); M(s_n++, s_n++.ToString()); //5.等同于以下兩行代碼: //string t1="2";int t2=3; //M(t2,t1,default(DateTime),new Guid()); M(s: (s_n++).ToString(), x: s_n++); } }
可為方法、構(gòu)造器方法和有參屬性(C#索引器)的參數(shù)指定默認值。還可為屬于委托定義一部分的參數(shù)指定默認值。
有默認值的參數(shù)必須放在沒有默認值的所有參數(shù)之后。但有一個例外:“參數(shù)數(shù)組”這種參數(shù)必須放在所有參數(shù)(包括有默認值的這些)之后,而且數(shù)組本身不能有一個默認值。
默認值必須是編譯時能確定的常量值(包括基元類型、枚舉類型,以及能設為null的任何引用類型)。值類型的參數(shù)可將默認值設為值類型的實例,并讓它的所有字段都包含零值??捎?strong>default或new關鍵字來表達這個意思,兩種語法生成的IL代碼完全一致。
不要重命名參數(shù)變量,否則任何調(diào)用者以傳參數(shù)名的方式傳遞實參,它們的代碼也必須修改。
如果方法從模塊外部調(diào)用,更改參數(shù)的默認值具有潛在的危險性。call site(發(fā)出調(diào)用的地方)在它的調(diào)用中嵌入默認值。如果以后更改了參數(shù)的默認值,但沒有重新編譯包含call site的代碼,它在調(diào)用你的方法時就會傳遞舊的默認值。可考慮將默認值 0/null 作為哨兵值使用,從而指出默認行為。例子:
//不要這樣做: private static string MakePath(string filename = "Untitled") { return string.Format(@"c\{0}.txt", filename); } //而要這樣做: private static string MakePath(string filename = null) { return string.Format(@"C:\{0}.txt", filename ?? "Untitled"); }
如果參數(shù)用 ref 或 out 關鍵字進行了標識,就不能設置默認值。
使用可選或命名參數(shù)調(diào)用方法時,還要注意以下附加的規(guī)則和原則:
實參可按任意順序傳遞,但命名實參只能出現(xiàn)在實參列表的尾部。
可按名稱將實參傳給沒有默認值的參數(shù),但所有必須的實參都必須傳遞(無論按位置還是按名稱)。
C#不允許省略逗號之間的實參,比如 M(1,,DateTime.Now)
。對于有默認值的參數(shù),如果想省略它們的實參,以傳參數(shù)名的方式傳遞實參即可。
如果參數(shù)要求 ref/out ,為了以傳參數(shù)名的方式傳遞實參,請使用下面這樣的語法:
//方法聲明: private static void M(ref int x) { ...} //方法調(diào)用: int a = 5; M(x: ref a);
C#調(diào)用COM組件時,如果是以傳引用的方式傳遞實參,C#還允許省略 ref/out ,進一步簡化編碼。但如果調(diào)用的不是COM組件,C#就要求必須向?qū)崊?ref/out 關鍵字。
不能用 var 聲明方法的參數(shù)類型。
不能用 var 聲明類型中的字段。
不要混淆 dynamic 和 var 。用 var 聲明局部變量只是一種簡化語法,它要求編譯器根據(jù)表達式推斷具體數(shù)據(jù)類型。 var 關鍵字只能聲明方法內(nèi)部的局部變量,而 dynamic 關鍵字適用于局部變量、字段和參數(shù)。表達式不能轉(zhuǎn)型為 var ,但能轉(zhuǎn)型為 dynamic 。必須顯式初始化用 var 聲明的變量,但無需初始化用 dynamic 聲明的變量。
private static void ImplicitlyTypedLocalVariables() { var name = "Jeff"; ShowVariableType(name); //顯示:System.String //var n=null; //錯誤,不能將null賦給隱式類型的局部變量 var x = (String)null; //可以這樣寫,但意義不大 ShowVariableType(x); //顯示:System.String var numbers = new int[] { 1, 2, 3, 4 }; ShowVariableType(numbers); //顯示:System.Int32[] //復雜類型能少打一些字 var collection = new Dictionary() { { "Grant", 4.0f } }; //顯示:System.Collections.Generic.Dictionary`2[System.String,System.Single] ShowVariableType(collection); foreach (var item in collection) { //顯示:System.Collections.Generic.KeyValuePair`2[System.String,System.Single] ShowVariableType(item); } } private static void ShowVariableType (T t) { Console.WriteLine(typeof(T)); }
CLR 默認所有方法參數(shù)都傳值。
CLR 允許以傳引用而非傳值的方式傳遞參數(shù)。C# 用關鍵字 out 或 ref 支持這個功能。
CLR 不區(qū)分 out 和 ref,無論用哪個關鍵字,都會生成相同的 IL 代碼。另外,元數(shù)據(jù)也幾乎完全一致,只有一個bit除外,它用于記錄聲明方法時指定的是 out 還是 ref 。
C#編譯器是將這兩個關鍵字區(qū)別對待的,而且這個區(qū)別決定了由哪個方法負責初始化所引用的對象。
使用 out 標記參數(shù)的方法,不能讀取該參數(shù)的值,而且在返回前必須向這個值寫入。相反,如果用 ref 標記方法,必須在調(diào)用方法前初始化參數(shù)的值,被調(diào)用的方法可以讀取值以及、或者向值寫入;
使用 out
public static void Main() { int x; //x沒有初始化 GetVal(out x); //x不必初始化 Console.WriteLine(x); //顯示“10” } private static void GetVal(out int v) { v = 10; //該方法必須初始化v }
使用 ref
public static void Main() { int x = 5; //x已經(jīng)初始化 GetVal(ref x); //x必須初始化 Console.WriteLine(x); //顯示“15” } private static void GetVal(ref int v) { v += 10; //該方法可使用v的已初始化的值 }
不能定義僅在 ref 和 out 上有差別的重載方法。
以傳引用的方式傳給方法的變量,它的類型必須與方法簽名中聲明的類型相同。
public static void Main() { string s1 = "Jeffrey"; string s2 = "Richter"; //錯誤!錯誤!錯誤! //Swap(ref s1, ref s2); //以傳引用的方式傳遞的變量, //必須和方法預期的匹配 object o1 = s1, o2 = s2; Swap(ref o1,ref o2); //完事后再將object轉(zhuǎn)型為string s1 = (string)o1; s2 = (string)o2; Console.WriteLine(s1); //顯示“Richter” Console.WriteLine(s2); //顯示“Jeffrey” } private static void Swap(ref object a, ref object b) { object t = b; b = a; a = t; }
可用泛型來修正上面方法
public static void Main() { string s1 = "Jeffrey"; string s2 = "Richter"; Swap(ref s1, ref s2); Console.WriteLine(s1); //顯示“Richter” Console.WriteLine(s2); //顯示“Jeffrey” } private static void Swap(ref T a, ref T b) { T t = b; b = a; a = t; }
params 只能應用于方法簽名中的最后一個參數(shù)。
這個參數(shù)只能標識一維數(shù)組(任意類型)。
可為這個參數(shù)傳遞 null 值,或傳遞對包含零個元素的一個數(shù)組的引用。
調(diào)用參數(shù)數(shù)量可變的方法對性能有所影響(除非顯式傳遞null)。要減少對性能的影響,可考慮定義幾個沒有使用 params 關鍵字的重載版本,如System.String
類的Concat方法。
public static void Main() { Console.WriteLine(Add(new int[] { 1, 2, 3, 4, 5 }));//顯示“15” //或 Console.WriteLine(Add(1, 2, 3, 4, 5)); //顯示“15” //以下兩行都顯示“0” Console.WriteLine(Add()); //向Add傳遞 new int[0] Console.WriteLine(Add(null)); //向Add傳遞 null :更高效(因為不會分配數(shù)組) } private static int Add(params int[] values) { // 注意:如果愿意,可將values數(shù)組傳給其他方法 int sum = 0; if (values != null) { for (int x = 0; x < values.Length; x++) sum += values[x]; } return sum; }
聲明方法的參數(shù)類型時,應盡量指定最弱的類型,寧愿要接口也不要基類。例如,如果要寫方法來處理一組數(shù)據(jù)項,最好是用接口(比如 IEnumerable
)聲明參數(shù),而不要用強數(shù)據(jù)類型(比如List
)或者更強的接口類型(比如ICollection
或IList
):
//好:方法使用弱參數(shù)類型 public void ManipulateItems(IEnumerable collection){} //不好:方法使用強參數(shù)類型 public void ManipulateItems (List collection) { }
相反,一般最好是將方法的返回類型聲明為最強的類型(防止受限于特定類型)。例如,方法最好返回FileStream而不是Stream對象:
//好:方法使用強返回類 public FileStream OpenFile() { } //不好:方法使用弱返回類 public Stream OpenFile() { }
如果想保持一定的靈活性,在將來更改方法返回的東西,請選擇一個較弱的返回類型。
//靈活:方法使用較弱的返回類型 public IListGetStringCollection() { } //不靈活:方法使用較強的返回類型 public List GetStringCollection() { }
上述內(nèi)容就是可選參數(shù)和命名參數(shù)的教程,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注創(chuàng)新互聯(lián)成都網(wǎng)站設計公司行業(yè)資訊頻道。
另外有需要云服務器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。