处理默认函数参数的唯一方法是通过函数重载吗?
例如,在PHP中,我可以这样做:
function foo($x, $y=0)
{
}
用C#处理它的最佳方法是这个吗?
void foo(int x)
{
foo(x, 0);
}
void foo(int x, int y)
{
}
修改
将C#示例变为实际C#(感谢Blair Conrad)
答案 0 :(得分:20)
只是为了满足一些好奇心:
来自Why doesn't C# support default parameters?:
在C ++等语言中,默认值可以作为方法声明的一部分包含在内:
void流程(员工员工,bool bonus = false)
可以使用以下方法调用此方法:
a.Process(employee,true);
或
a.Process(雇员);
在第二种情况下,参数奖励设置为false。
C#没有此功能。
我们没有此功能的一个原因与功能的特定实现有关。在C ++世界中,当用户写道:
a.Process(雇员);
编译器生成
a.process(employee,false);
换句话说,编译器采用方法原型中指定的默认值并将其放入方法调用中 - 就像用户将'false'写为第二个参数一样。如果不强制类的用户重新编译,就无法更改默认值,这是不幸的。
重载模型在这方面效果更好。框架作者只定义了两个单独的方法,单参数方法调用了双参数方法。这样可以保留框架中的默认值,必要时可以对其进行修改。
编译器可能会采用C ++定义之类的东西并产生重载,但这种方法存在一些问题。
第一个是用户编写的代码与编译器生成的代码之间的关联不太明显。我们通常尽可能地限制魔法,因为它使程序员更难。第二个问题与XML文档注释和智能感知等问题有关。编译器必须对如何为重载方法生成doc注释有特殊规则,而intellisense需要智能将重载方法折叠为单个方法。
自己编写重载不太方便,但我们认为这是一个可接受的解决方案。
答案 1 :(得分:5)
是的,这是最好的,除非你在参数名称上省略$
,正如其他人所指出的那样。对于那些对缺乏默认参数值背后的基本原理感兴趣的人,请参阅@Giovanni Galbo的解释。
答案 2 :(得分:4)
那里列出的大多数问题都是针对VB.Net解决的(特别是intellisense和xml评论问题),这意味着它们真的是红色的鲱鱼 - C#团队可以使用代码来解决问题。
另一个原因与强制类的用户重新编译有关,但这也是一个红色的鲱鱼。如果更改框架类中的默认值并且用户不必须重新编译,则可能会使用户不知道默认值已更改。现在你的代码中有一个潜在的错误,直到运行时才出现。换句话说,重载函数的替代方案至少同样糟糕。当然,这也假定了该功能的具体实现,但它是常见问题中建议的实现。
因此,你必须权衡剩下的原因(“试图限制魔法”)与他们承认的事实(他们承认这一点)编写重载“不太方便”。就个人而言,我说把功能放进去,让程序员决定是否使用它。
答案 3 :(得分:2)
默认参数是C ++的一部分,但是从C#3.5开始,默认参数仍然不受支持 - 你必须超载。自1.0以来,它们已经在VB.Net中可用。
答案 4 :(得分:0)
是。
或者说。
或者抽象成一个类并在那里使用默认值。
答案 5 :(得分:0)
不,AFAIK C#不支持覆盖,是的,这是实现相同效果的推荐方法。
答案 6 :(得分:0)
这不能胜任这个工作吗?
void foo(int x):this(x, 0){}
void foo(int x, int y){
// code here
}
答案 7 :(得分:0)
正如所指出的那样,目前C#中没有这个版本,但是他们将在C#4.0中出现,正如Sam Ng在他的博客上讨论的那样: