[ C# 4.0/.NET 4.0 新增特性 ]
3.1 帶默認值的方法
static void Main(string[] args) { // 01.帶默認值參數函數 FuncWithDefaultPara(); // 02.省略一個默認參數調用 FuncWithDefaultPara(10086); Console.ReadKey(); } static void FuncWithDefaultPara(int id = 10010, bool gender = true) { Console.WriteLine("Id:{0},Gender:{1}", id, gender ? "Man" : "Woman"); }
點擊調試,顯示結果如下:

3.2 編譯后的方法調用
同樣,為了一探帶參數默認值方法調用的細節,我們還是借助反編譯神器查看其中的玄妙:
(1)首先,我們來看看帶默認值參數的方法被編譯后是怎么的:

可以看到,在.NET Framework中大量采用了基於Attribute的開發方式,這里為參數添加了表示默認值的特性DefaultParameterValue。
(2)其次,再來看看Main函數中的調用過程是怎么被編譯的:

可以看出,編譯器幫我們在方法調用的括號中幫我們填充了默認值。這里,我們不禁好奇,如果在調用中,不指定ID(即使用ID默認值10010)而僅僅指定Gender為false是否可以編譯通過?我們來試一下:
static void Main(string[] args) { // 01.帶默認值參數函數 FuncWithDefaultPara(); // 02.省略一個默認參數調用 FuncWithDefaultPara(10086); // 錯誤調用: FuncWithDefaultPara(false); Console.ReadKey(); }
這時,出現了以下錯誤:

於是,我們知道,CSC也還沒有那么智能,無法理解我們高深的“意圖”。那么,有木有一種方法來解決這種需求呢,於是命名參數橫空出世了。
3.3 使用命名參數
在新語法中為方法調用引入了命名參數,格式為 參數名:參數值
static void Main(string[] args) { // 01.帶默認值參數函數 FuncWithDefaultPara(); // 02.省略一個默認參數調用 FuncWithDefaultPara(10086); // 錯誤調用: //FuncWithDefaultPara(false); // 03.使用命名參數調用 FuncWithDefaultPara(gender: false); Console.ReadKey(); }
通過調試,可以得到如下結果:

通過前面的分析,我們可以分析出,使用命名參數被編譯之后還是會生成指定參數值的調用:

出處:http://edisonchou.cnblogs.com
