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,可变参函数可接受任意数量的参数.例 ...
随机推荐
- gin框架中设置信任代理IP并获取远程客户端IP
package main import ( "fmt" "github.com/gin-gonic/gin" ) func main() { gin.SetMo ...
- insert插入日期
7.5.insert插入日期 数字格式化:format select ename,sal from emp: 格式化数字:fromat(数字,'格式') select ename,format(sal ...
- yum源 epel源 no package available 更换国内yum源
有时候安装软件会出现 no package available 解决办法:yum install epel-release 安装完会在/etc/yum.repos.d/目录下下生成两个repo文件: ...
- java ++ -- 异或 短路与 短路或 三目条件
public class Demo { public static void main(String[] args) { int i1 = 12, i2 = 20; int i = (i2++); S ...
- 学习JAVAWEB第十六天
今天做了一个简单的登陆界面,HTML+CSS太不熟悉了,明天还得接着做
- Lesson2——Pandas库下载和安装
pandas目录 简介 Python 官方标准发行版并没有自带 Pandas 库,因此需要另行安装.除了标准发行版外,还有一些第三方机构发布的 Python 免费发行版, 它们在官方版本的基础上开发而 ...
- CF388C Fox and Card Game
基于观察可以发现,双方都一定能保证取到每一列靠近自己的 \(\lfloor \frac{k}{2} \rfloor\) 个元素. 那么一旦一个人想要取另一个人能必然能取的部分,另一个人必然可以不让其取 ...
- Swift 介绍
简介 Swift 语言由苹果公司在 2014 年推出,用来撰写 OS X 和 iOS 应用程序 2014 年,在 Apple WWDC 发布 几家欢喜,几家愁 愁者:只学Object-C的人 欢喜者: ...
- MySQL数据类型的最优选择
MySQL数据类型的最优选择 慎重选择数据类型很重要.为啥哩?可以提高性能.原理如下: ● 存储(内存.磁盘).从而节省I/O(检索相同数据情况下) ● 计算.进而 ...
- mysql查询奇数行或者偶数行数据
select * from (select @rownum := @rownum+1 as row_num, t.* from 表名 t,(select @rownum:=0) tmp_table o ...