10

处理默认函数参数的唯一方法是通过函数重载,这是真的吗?

例如,在 PHP 中,我可以这样做:

function foo($x, $y=0)
{
}

在 C# 中处理它的最佳方法是这样吗?

void foo(int x)
{
  foo(x, 0);
}

void foo(int x, int y)
{
}

从这里举起的例子

编辑

将 C# 示例变为实际的 C#(感谢 Blair Conrad)

4

8 回答 8

20

只是为了满足一些好奇心:

为什么 C# 不支持默认参数?

在 C++ 等语言中,可以在方法声明中包含默认值:

无效流程(员工员工,布尔奖金=假)

可以使用以下方法调用此方法:

a.Process(员工,真);

或者

a.流程(员工);

在第二种情况下,参数bonus 设置为false。

C# 没有这个特性。

我们没有此功能的一个原因与该功能的特定实现有关。在 C++ 世界中,当用户编写时:

a.流程(员工);

编译器生成

a. 流程(员工,假);

换句话说,编译器采用方法原型中指定的默认值并将其放入方法调用中 - 就像用户将“false”作为第二个参数一样。如果不强制类的用户重新编译,就无法更改该默认值,这是不幸的。

重载模型在这方面效果更好。框架作者只是定义了两个独立的方法,单参数的调用了双参数的方法。这将默认值保留在框架中,如有必要,可以在其中进行修改。

编译器可以采用 C++ 定义之类的东西并产生重载,但这种方法存在一些问题。

第一个是用户编写的代码与编译器生成的代码之间的相关性不太明显。我们通常会尽可能地限制魔法,因为它会让程序员更难。第二个问题与 XML 文档注释和智能感知等有关。编译器必须有特殊的规则来为重载方法生成文档注释,并且智能感知需要智能将重载方法折叠成单个方法。

自己编写重载不太方便,但我们认为这是一个可以接受的解决方案。

于 2008-09-02T17:38:58.987 回答
5

是的,这是最好的,除了你会省略$参数名称上的 s,正如其他人所指出的那样。对于那些对缺少默认参数值背后的基本原理感兴趣的人,请参阅@Giovanni Galbo 的解释。

于 2008-09-02T17:27:26.333 回答
4

关于c# faq 的摘录

那里列出的大多数问题都已针对 VB.Net 解决(特别是智能感知和 xml 注释问题),这意味着它们确实是红鲱鱼——C # 团队可以使用代码来解决问题。

另一个原因与强制类的用户重新编译有关,但这也有点牵强附会。如果您更改框架类中的默认值并且用户不必重新编译,则您可能会冒用户不知道默认值已更改的风险。 现在您的代码中有一个潜在的错误,直到运行时才会出现。换句话说,重载函数的替代方案至少同样糟糕。当然,这也假定了该功能的具体实现,但它是常见问题中建议的实现。

因此,您必须权衡剩余的原因(“尝试限制魔法”)与编写重载“不太方便”的事实(他们承认)。就个人而言,我说把这个功能放进去,让程序员决定是否使用它。

于 2008-09-02T18:37:04.213 回答
2

默认参数是 C++ 的一部分,但从 C# 3.5 开始,仍然不支持默认参数——您必须重载。自 1.0 以来,它们已在 VB.Net 中可用。

于 2008-09-02T17:27:48.563 回答
0

是的。

或咖喱。

或者抽象成一个类并在那里使用默认值。

于 2008-09-02T17:28:10.510 回答
0

不,AFAIK C# 不支持覆盖,是的,这是实现相同效果的推荐方式。

于 2008-09-02T17:28:30.213 回答
0

这不工作吗?

void foo(int x):this(x, 0){}

void foo(int x, int y){
 // code here
}
于 2009-03-30T10:05:11.173 回答
0

正如所指出的,这目前在 C# 中不可用,但它们将出现在 C# 4.0 中,正如 Sam Ng 在他的博客上讨论的那样:

http://blogs.msdn.com/samng/archive/2009/02/03/named-arguments-optional-arguments-and-default-values.aspx

于 2009-03-30T10:18:04.747 回答