处理默认函数参数的唯一方法是通过函数重载吗?
例如,在PHP中我可以这样做:
function foo($x, $y=0) { }
在C#中处理它的最佳方法是这样吗?
void foo(int x) { foo(x, 0); } void foo(int x, int y) { }
示例从此处解除
编辑
将C#示例变成了实际的C#(感谢Blair Conrad)
只是为了满足一些好奇心:
从什么不C#支持默认参数?:
在C++等语言中,默认值可以作为方法声明的一部分包含在内:
void Process(员工员工,bool bonus = false)
可以使用以下方法调用此方法:
a.Process(员工,真实);
要么
a.Process(雇员);
在第二种情况下,参数奖励设置为false.
C#没有此功能.
我们没有此功能的一个原因与功能的特定实现有关.在C++世界中,当用户写道:
a.Process(雇员);
编译器生成
a.process(employee,false);
换句话说,编译器采用方法原型中指定的默认值并将其放入方法调用中 - 就像用户将'false'写为第二个参数一样.没有强制类的用户重新编译就无法更改默认值,这是不幸的.
在这方面,重载模型效果更好.框架作者只定义了两个单独的方法,单参数方法调用了双参数方法.这将保留框架中的默认值,必要时可以在其中进行修改.
编译器可以采用类似C++定义的东西并产生重载,但是这种方法存在一些问题.
第一个是用户编写的代码与编译器生成的代码之间的关联不太明显.我们通常尽可能地限制魔法,因为它使程序员更难.第二个问题与XML文档注释和智能感知等问题有关.编译器必须对如何为重载方法生成doc注释有特殊规则,而intellisense需要智能将重载方法折叠到单个方法中.
自己编写超载有点不方便,但我们认为这是一个可以接受的解决方案.
是的,这是最好的,除非你,正如其他人所指出的那样.对于那些对缺乏默认参数值背后的基本原理感兴趣的人,请参阅@Giovanni Galbo的解释.$
在参数名称上省略了s