方法重载与可选参数

本文关键字:参数 重载 方法 | 更新日期: 2023-09-27 17:55:44

我似乎记得读到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);
}

方法重载与可选参数

我更喜欢方法重载。可选参数存在已知的版本控制问题。

这里有一篇Jon Skeet的非常好的文章。

添加此功能的动机是使与 COM 的通信变得更加容易,其中方法可以具有许多参数,而对于 C# 类的新设计实践而言,这些参数更少

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

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

将为调用方生成代码:

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

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

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

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

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);
}

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

可选参数是语法糖。

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