C#⽅法⾥⾯的默认参数
最近有很多地⽅都⽤到了⽅法的默认参数,遂总结之。
(⼀)先从原理说起
在C#中,⼀旦为某个参数分配了⼀个默认值,编译器就会向内部该参数应⽤定制⼀个attribute 即是(OptionalAttribute)这个attribute会在最终⽣产的⽂件的元数据类型持久性的存储下来,除此之外,编译器会向参数应⽤⼀个DefaultParameterValueAttribue,也会将这个特性持久性存储在最终⽂件的元数据⾥⾯。⼀旦编译器发现某个⽅法调⽤的时候,缺失部分实参,就可以确定是可选实参并从元数据中提取默认值,将值⾃动嵌⼊。说到底还是特性的作⽤呀,这⾥有⼀篇关于特性的⽂章();
有种情况可以适⽤⽅法的默认参数的情况,就是别⼈写的⽅法(已经很多地⽅⽤了,你现在想加个参数,⼜不⽤去改原来引⽤的代码)。当然你可以写个⽅法的重载,我也曾经想写重装来加上这个参数条件。因为重载已经会⽤了,所以就学习了下⽅法参数缺省的情况。
下⾯我给⼤家提供⼀个例⼦,⼤家可以好好看看,⾃⼰动⼿⼀试。
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}");
}
writeline方法的作用//第⼆种做法
static void TestDefaultMethod(string foo,string bar = null) {
bar = bar ?? "bar123";
Console.WriteLine($"{foo}{bar}");
}
推荐使⽤下⾯这种做法
上⾯这个是最重要的,如果你想着啥时候⽤缺省参数和函数重载,请根据情况来定吧。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论