是否重载在C#中拥有默认函数参数的唯一方法?

时间:2008-09-02 17:25:56

标签: c# overloading

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

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

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

用C#处理它的最佳方法是这个吗?

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

void foo(int x, int y)
{
}

Example lifted from here

修改

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

8 个答案:

答案 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)

关于excerpt from the c# faq

那里列出的大多数问题都是针对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在他的博客上讨论的那样:

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