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

相关文章
相关标签/搜索