zoukankan      html  css  js  c++  java
  • C# 方法里面的默认参数

            最近有很多地方都用到了方法的默认参数,遂总结之。

       (一)先从原理说起

          在C#中,一旦为某个参数分配了一个默认值,编译器就会向内部该参数应用定制一个attribute 即是(OptionalAttribute)这个attribute会在最终生产的文件的元数据类型持久性的存储下来,除此之外,编译器会向参数应用一个DefaultParameterValueAttribue,也会将这个特性持久性存储在最终文件的元数据里面。一旦编译器发现某个方法调用的时候,缺失部分实参,就可以确定是可选实参并从元数据中提取默认值,将值自动嵌入。说到底还是特性的作用呀,这里有一篇关于特性的文章(https://www.cnblogs.com/gdouzz/p/9684720.html);

           有种情况可以适用方法的默认参数的情况,就是别人写的方法(已经很多地方用了,你现在想加个参数,又不用去改原来引用的代码)。当然你可以写个方法的重载,我也曾经想写重装来加上这个参数条件。因为重载已经会用了,所以就学习了下方法参数缺省的情况。

          下面我给大家提供一个例子,大家可以好好看看,自己动手一试。

          SayHello方法的定义如下,当我们写这个的时候,会怎么进行调用呢,请大家谈谈。  SayHello("name',"value")

    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写的那篇文章,讲得很好。但是我他说的那些,可以作为入门,但是并不能当成准则来对待。

         上面这种写法并没有啥毛病,但是如果方法是从模块的外部调用,更改参数的默认值具有潜在的危险性,call site在调用的嵌入了默认值,如果你以后更改了参数的默认值,但没有重新编译call site里面的所在代码,它在调用你方法的时候,依然会传递旧的默认值,所以可以考虑将0/null 作为哨兵的值使用,从而指出默认行为,这样一来,即使更改了默认值,也不必要重新编译包含了call site的全部代码。

           //第一种做法
            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}"); }
    推荐使用下面这种做法

       上面这个是最重要的,如果你想着啥时候用缺省参数和函数重载,请根据情况来定吧 。

  • 相关阅读:
    Perl 基础笔记: 使用 cpanm 安装 Perl 模块
    修改CPAN安装源
    JQUERY实现点击INPUT使光标移动到最后或指定位置
    新手入门Underscore.js 中文(template)
    深入浅出C/C++中的正则表达式库
    [libxml2]_[XML处理]_[使用libxml2的xpath特性修改xml文件内容]
    Mysql事务的隔离级别
    HBase基础知识摘要
    java如何实现一个Future
    遇到过的问题整理-大量页面监控问题
  • 原文地址:https://www.cnblogs.com/gdouzz/p/6889163.html
Copyright © 2011-2022 走看看