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