C# 參數默認值和命名參數


[ 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM