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}");
}
推荐使用下面这种做法
上面这个是最重要的,如果你想着啥时候用缺省参数和函数重载,请根据情况来定吧 。
C# 方法里面的默认参数的更多相关文章
- 使用可变对象作为python函数默认参数引发的问题
写python的都知道,python函数或者方法可以使用默认参数,比如 1 def foo(arg=None): 2 print(arg) 3 4 foo() 5 6 foo("hello ...
- Python中为什么不能用可变对象作为默认参数的值
def func(numbers = [], num=1): numbers.append(num) for number in numbers: print(number) func() >& ...
- C# 方法中带默认值的参数
设计一个方法的参数时,可为部分或全部参数分配默认值.然后,调用这些方法的代码可以选择不指定部分实参,接受其默认值.除此之外,调用方法时,还可通过指定参数名称的方式为其传递实参.以下代码演示了可选参数和 ...
- redux中createStore方法的默认参数
一般使用方法: createStore(reducer, applyMiddleware(thunk)) 传递默认参数: createStore(reducer, defaultState, appl ...
- 我的c++学习(6)默认参数和内联函数
默认参数 一般情况下,函数调用时实参个数应与形参相同,但为了更方便地使用函数,C++也允许定义具有默认参数的函数,这种函数调用时实参个数可以与形参不相同.“默认参数”指在定义或声明函数时为形参指定默认 ...
- Android 系统默认参数的修改
转自: http://www.th7.cn/Program/Android/201505/447097.shtml 写在前面的话 一般在新项目开始之初,我们需要针对客户需求进行各种系统默认属性的配置, ...
- c++有默认参数的函数---4
原创博客:转载请标明出处:http://www.cnblogs.com/zxouxuewei/ 1.默认参数的目的 C++可以给函数定义默认参数值.通常,调用函数时,要为函数的每个参数给定对应的实参. ...
- C++:构造函数的默认参数知识拓展
和普通函数一样,构造函数中参数的值既可以通过实参传递,也可以指定为某些默认值,即如果用户不指定实参值,编译系统就使形参取默认值. 例9.3的问题也可以使用包含默认参数的构造函数来处理. [例9 ...
- 深入浅出ES6(五):不定参数和默认参数
作者 Jason Orendorff github主页 https://github.com/jorendorff 不定参数 我们通常使用可变参函数来构造API,可变参函数可接受任意数量的参数.例 ...
随机推荐
- Clusternet:一款开源的跨云多集群云原生管控利器!
作者 徐迪,Clusternet 项目发起人,腾讯云容器技术专家. 摘要 Clusternet (Cluster Internet)是一个兼具多集群管理和跨集群应用编排的开源云原生管控平台,解决了跨云 ...
- 将Java连接数据库操作封装到MySQL类中
public class MySQL { final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver"; final String D ...
- shiro 框架之 加密处理。
一.shiro 加密? /* Shiro? 一.为什么要加密? 为调高数据库的安全性,需要给密码加密. 二.常见的加密算法? 1.1哈希算法 md5:加密算法 哈希函数 1.2.对称算法 1.3.非对 ...
- libevent网络库
1.概述 libevent是一个C语言编写的.轻量级开源高性能事件通知库.作为底层网络库,已经被广泛应用(如:memcached.Vomit.Nylon.Netchat等).主要有以下几个亮点: 事件 ...
- AT2346 [ARC070B] No Need
这里介绍几种做法. 解法一 首先可以转化一下题意,\(\forall i\) 如果 \(i\) 不是可有可无的当且仅当不用 \(i\) 能拼出 \([K - a_i, K)\) 中的数. 基于观察可以 ...
- [学习笔记]Linux环境下部署 .Net5 程序
公司的项目需要部署到一台公网的linux服务器,以便同事们测试小程序. 目标服务器是新搭建的CentOS 8虚拟机,以非docker的方式部署.现记录过程便于日后部署至项目甲方的服务器上,因为甲方的 ...
- Idea中新建package包,却变成了Directory
问题描述 今天在IdeaJava工程src下新建了一个名字叫包implements的包,右键在里面新建类时,却发现根本就没有Class这个选项,然后发现implements这个包的图标也和其他包的图标 ...
- table 增加或删除一行
转载请注明来源:https://www.cnblogs.com/hookjc/ <HTML><SCRIPT LANGUAGE="JScript">funct ...
- ANT中的copy和move标签
Copy标签 该标签用于文件或文件集的拷贝,其属性如下: file 表示源文件. tofile 表示目标文件. todir 表示目标目录. overwrite 表示指定是否覆盖目标文件,默认值是不覆盖 ...
- iOS 性能优化系列
Objective-C 高性能的循环 使用 Swift 和 Objective-C 执行 iOS 内存管理的 7 个简单技巧 @autoreleasepool-内存的分配与释放