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

(一)先从原理说起

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

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

C# 方法里面的默认参数的更多相关文章

  1. 使用可变对象作为python函数默认参数引发的问题

    写python的都知道,python函数或者方法可以使用默认参数,比如 1 def foo(arg=None): 2 print(arg) 3 4 foo() 5 6 foo("hello ...

  2. Python中为什么不能用可变对象作为默认参数的值

    def func(numbers = [], num=1): numbers.append(num) for number in numbers: print(number) func() >& ...

  3. C# 方法中带默认值的参数

    设计一个方法的参数时,可为部分或全部参数分配默认值.然后,调用这些方法的代码可以选择不指定部分实参,接受其默认值.除此之外,调用方法时,还可通过指定参数名称的方式为其传递实参.以下代码演示了可选参数和 ...

  4. redux中createStore方法的默认参数

    一般使用方法: createStore(reducer, applyMiddleware(thunk)) 传递默认参数: createStore(reducer, defaultState, appl ...

  5. 我的c++学习(6)默认参数和内联函数

    默认参数 一般情况下,函数调用时实参个数应与形参相同,但为了更方便地使用函数,C++也允许定义具有默认参数的函数,这种函数调用时实参个数可以与形参不相同.“默认参数”指在定义或声明函数时为形参指定默认 ...

  6. Android 系统默认参数的修改

    转自: http://www.th7.cn/Program/Android/201505/447097.shtml 写在前面的话 一般在新项目开始之初,我们需要针对客户需求进行各种系统默认属性的配置, ...

  7. c++有默认参数的函数---4

    原创博客:转载请标明出处:http://www.cnblogs.com/zxouxuewei/ 1.默认参数的目的 C++可以给函数定义默认参数值.通常,调用函数时,要为函数的每个参数给定对应的实参. ...

  8. C++:构造函数的默认参数知识拓展

    和普通函数一样,构造函数中参数的值既可以通过实参传递,也可以指定为某些默认值,即如果用户不指定实参值,编译系统就使形参取默认值.   例9.3的问题也可以使用包含默认参数的构造函数来处理.   [例9 ...

  9. 深入浅出ES6(五):不定参数和默认参数

    作者 Jason Orendorff  github主页  https://github.com/jorendorff 不定参数 我们通常使用可变参函数来构造API,可变参函数可接受任意数量的参数.例 ...

随机推荐

  1. gin框架中设置信任代理IP并获取远程客户端IP

    package main import ( "fmt" "github.com/gin-gonic/gin" ) func main() { gin.SetMo ...

  2. insert插入日期

    7.5.insert插入日期 数字格式化:format select ename,sal from emp: 格式化数字:fromat(数字,'格式') select ename,format(sal ...

  3. yum源 epel源 no package available 更换国内yum源

    有时候安装软件会出现 no package available 解决办法:yum install epel-release 安装完会在/etc/yum.repos.d/目录下下生成两个repo文件: ...

  4. java ++ -- 异或 短路与 短路或 三目条件

    public class Demo { public static void main(String[] args) { int i1 = 12, i2 = 20; int i = (i2++); S ...

  5. 学习JAVAWEB第十六天

    今天做了一个简单的登陆界面,HTML+CSS太不熟悉了,明天还得接着做

  6. Lesson2——Pandas库下载和安装

    pandas目录 简介 Python 官方标准发行版并没有自带 Pandas 库,因此需要另行安装.除了标准发行版外,还有一些第三方机构发布的 Python 免费发行版, 它们在官方版本的基础上开发而 ...

  7. CF388C Fox and Card Game

    基于观察可以发现,双方都一定能保证取到每一列靠近自己的 \(\lfloor \frac{k}{2} \rfloor\) 个元素. 那么一旦一个人想要取另一个人能必然能取的部分,另一个人必然可以不让其取 ...

  8. Swift 介绍

    简介 Swift 语言由苹果公司在 2014 年推出,用来撰写 OS X 和 iOS 应用程序 2014 年,在 Apple WWDC 发布 几家欢喜,几家愁 愁者:只学Object-C的人 欢喜者: ...

  9. MySQL数据类型的最优选择

    MySQL数据类型的最优选择   慎重选择数据类型很重要.为啥哩?可以提高性能.原理如下:            ● 存储(内存.磁盘).从而节省I/O(检索相同数据情况下)      ● 计算.进而 ...

  10. mysql查询奇数行或者偶数行数据

    select * from (select @rownum := @rownum+1 as row_num, t.* from 表名 t,(select @rownum:=0) tmp_table o ...