C#系列文章之參數。本站提示廣大學習愛好者:(C#系列文章之參數)文章只能為提供參考,不一定能成為您想要的結果。以下是C#系列文章之參數正文
解決的主要問題:
文章的主要內容:
1.1可選參數和命名參數
在方法中為部分參數指定默認值的規則和原則:
//不要這樣做 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"); }
調用方法時,傳參數時規則和原則:
//方法的聲明 private static void M(ref int x){.......} //方法的調用 int a = 5; M(x:ref a);
此外不能用var聲明方法的參數類型,不要混淆dynamic和var。用var聲明局部變量只是一種簡化的語法,他要求編譯器根據表達式推斷出具體數據類型,其只能聲明方法內部的局部變量,而dynamic關鍵字適用於局部變量,字段和參數。另外,必須顯示初始化用var聲明的變量。
1.2以傳引用的方式向方法傳遞參數(out ref)
CLR默認所有方法參數都傳值,對於引用類型,對象的指針被傳給方法,這個指針也是當做值來傳遞的,意味著方法能修改對象。對於值類型,由於是在棧上,傳給方法是一個副本,調用者中的實例不受影響。
CLR不區分out和ref,無論用哪個都會生成相同的IL代碼。元數據除了有一個bit用於說明是out還是ref外,剩下幾乎一致。用out標記表明調用者在調用方法之前不指望你已初始化好了對象,被調用的方法不能讀取參數的值,要求返回前必須向這個值寫入。用ref標記,調用者就必須先初始化參數的值。為較大的值類型使用out,可提升代碼執行效率,因為它避免了在進行方法調用時復制值類型實例的字段。
CLR允許根據使用的是out 還是ref參數對方法進行重載,例如:
//如下兩個方法可以實現重載, //但是如果只有out和ref區別,則不合法, //因為兩個簽名的元數據形式相同 public class Point { void Add(Point p){.....}; void Add(ref Point p){.....}; }
1.3 向方法傳遞可變數量的參數
使用如下聲明,接受可變數量的參數
int Add(params int[] values) { int sum =0; if(values!=null) { for(int x = 0; x<values.length;x++){.....} } return sum }
調用時可以是Add(new int[]{1,2,3...});也可以是Add(1,2,3...);
編譯器在檢測到方法調用時,會檢查所有具有指定名稱同時參數沒有應用ParamArray特性的方法。找到就生成調用它所需的代碼,否則就檢查應用ParamArray特性的方法,此時編譯器生成代碼構造一個數組,填充元素,再生成代碼來調用所選的方法。
只有方法最後一個參數才可以用Params關鍵字標記,也只能標識一組數組(任意類型),可傳遞null或不傳值;
調用參數數量可變的方法對性能有所影響(除非顯式傳遞null)。畢竟數組對象必須在堆上分配,數組元素必須初始化,而且數組內存最終需要垃圾回收。為此可以定義幾個沒有使用params關鍵字的重載版本。
1.4 參數和返回類型的設計規范
聲明方法參數類型應盡量指定最弱類型,寧願要接口也不要基類。比如處理一組數據項,最好用IEnumerable<T>,而不要用強數據類型List<T>或強接口類型ICollection<T>或IList<T>。原因是要盡可能使接受的參數范圍廣,更靈活。相反一般將方法返回類型聲明為最強類型(防止受限於特定類型)。總之確保調用者調用方法有盡量大的靈活性,使方法適用范圍更大。
有時在不影響調用者前提下修改方法內部實現。如果方法返回List<string>,可能會在未來某個時候修改內部方法實現返回string[]。若想保持一定的靈活性,可以選擇較弱的返回類型。比如IList<string>不建議使用最弱的IEnumerable<string>,也不使用較強的IConllction<string>