【问题标题】:Method Overloading Versus Optional Parameters方法重载与可选参数
【发布时间】:2011-05-10 15:00:35
【问题描述】:

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

【问题讨论】:

  • 我对 C# 不是很熟悉,但是当你想要不同类型的参数时,通常会使用方法重载。使用可选参数,它们只能是那个特定的类型。

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


【解决方案1】:

我更喜欢方法重载。可选参数存在known versioning 问题。

Jon Skeethere有一篇非常好的文章。

添加它的动机是更容易与 COM 对话,其中方法可以有很多参数,而对于 C# 类的新设计实践却更少

【讨论】:

  • 这正是我想要的。非常感谢。
  • “已知版本问题”实际上不是问题,也不是反对使用可选参数的论据。只有在下一个版本中修改方法时,它们才会成为问题。但这可以通过添加重载而不是可选参数来轻松解决。问题解决了(是的,Phil 说了其他话,但他犯了一个错误,因为他将新参数设为可选)。
【解决方案2】:

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

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

将为调用者生成代码:

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

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

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

【讨论】:

    【解决方案3】:

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

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

    此外,您需要维护的功能更少(尽管很简单)。

    【讨论】:

    • 我不记得有任何关于方法重载和可选参数之间功能上的重大差异的讨论——所以为了代码维护,我会默认使用可选参数——并且仅在某些情况下需要我使用重载这样做。
    • k_dflt_str”——什么?!不不不不不。
    • @Konrad Rudolph:嘿,大脑目前处于我们的 PL/SQL 标准模式。 ;)
    【解决方案4】:

    可选参数是语法糖。

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

    【讨论】:

    • 他们的 IL 不同。让我觉得他们在 JIT 之后仍然不同。向后兼容性也值得怀疑。由于在 .Net 4 之前的 IL 中支持可选参数。
    猜你喜欢
    • 2011-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-19
    • 2013-05-23
    相关资源
    最近更新 更多