方法重载与可选参数

时间:2011-05-10 15:00:36

标签: c# c#-4.0 methods optional-parameters

我似乎记得读过C#4.0中方法重载(和构造函数链接)和可选参数之间存在重要区别,但我无法找到任何确认任何差异的内容。

以下两种实现之间是否存在重大差异?

第一

public void Foo()
{
   Foo(String.Empty);
}

public void Foo(string message)
{
   Console.WriteLine(message);
}

第二

public void Foo(string message = "")
{
   Console.WriteLine(message);
}

4 个答案:

答案 0 :(得分:8)

我赞成方法重载。可选参数存在known versioning个问题。

Jon Skeet here发表了一篇非常好的文章。

添加此功能的动机使其更容易与COM交谈,其中方法可以有许多参数,而不是新的C#类设计实践

答案 1 :(得分:3)

可选参数的作用类似于常量,并在编译时替换。

public void Foo(string s = "default")
Foo();

将为调用者生成代码:

public void Foo(string s)
Foo("default");

这意味着如果您选择更改新版本中的默认值,那么引用您的所有程序集都将具有OLD默认值!

重载不像常量,并隐藏程序集中的默认值。这提供了一个干净的升级路径。

答案 2 :(得分:1)

我会选择第二种选择。您可以将默认字符串更改为某个常量,然后在以后可以更改常量的值,例如:

constant String defaultString = String.Empty; //change this later if the default value needs to be something else, can't remember if the syntax is valid C# ;)
//...
public void Foo(string message = defaultString)
{
   Console.WriteLine(message);
}

此外,您还需要维护一个(尽管很简单)功能。

答案 3 :(得分:0)

可选参数是语法糖。

除了与以前版本的.NET的向后兼容性之外,它们是相同的。