我似乎记得读过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);
}
答案 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的向后兼容性之外,它们是相同的。