C# 方法裏面的默認參數

        最近有不少地方都用到了方法的默認參數,遂總結之。html

   (一)先從原理提及

      在C#中,一旦爲某個參數分配了一個默認值,編譯器就會向內部該參數應用定製一個attribute 便是(OptionalAttribute)這個attribute會在最終生產的文件的元數據類型持久性的存儲下來,除此以外,編譯器會向參數應用一個DefaultParameterValueAttribue,也會將這個特性持久性存儲在最終文件的元數據裏面。一旦編譯器發現某個方法調用的時候,缺失部分實參,就能夠肯定是可選實參並從元數據中提取默認值,將值自動嵌入。說到底仍是特性的做用呀,這裏有一篇關於特性的文章(http://www.javashuo.com/article/p-fpbhnwjq-bo.html);函數

       有種狀況能夠適用方法的默認參數的狀況,就是別人寫的方法(已經不少地方用了,你如今想加個參數,又不用去改原來引用的代碼)。固然你能夠寫個方法的重載,我也曾經想寫重裝來加上這個參數條件。由於重載已經會用了,因此就學習了下方法參數缺省的狀況。學習

      下面我給你們提供一個例子,你們能夠好好看看,本身動手一試。spa

      SayHello方法的定義以下,當咱們寫這個的時候,會怎麼進行調用呢,請你們談談。  SayHello("name',"value")code

void SayHello(string name, string value, string text = "zz")
        {
            Console.WriteLine("走了一個缺省");
        }

 void SayHello(string name, string value, string text = "zz", string age = "test")
        {
            Console.WriteLine("走了兩個缺省");
        }

      我也看了園子裏面大內老A寫的那篇文章,講得很好。可是我他說的那些,能夠做爲入門,可是並不能當成準則來對待。htm

     上面這種寫法並無啥毛病,可是若是方法是從模塊的外部調用,更改參數的默認值具備潛在的危險性,call site在調用的嵌入了默認值,若是你之後更改了參數的默認值,但沒有從新編譯call site裏面的所在代碼,它在調用你方法的時候,依然會傳遞舊的默認值,因此能夠考慮將0/null 做爲哨兵的值使用,從而指出默認行爲,這樣一來,即便更改了默認值,也沒必要要從新編譯包含了call site的所有代碼。blog

       //第一種作法
        static void TestMethod(string foo,string bar="bar123") {
            Console.WriteLine($"{foo}{bar}");
        }
     
//第二種作法
static void TestDefaultMethod(string foo,string bar = null) { bar = bar ?? "bar123"; Console.WriteLine($"{foo}{bar}"); }
推薦使用下面這種作法

   上面這個是最重要的,若是你想着啥時候用缺省參數和函數重載,請根據狀況來定吧 。get

相關文章
相關標籤/搜索