【问题标题】:Optional parameters可选参数
【发布时间】:2009-07-30 14:43:00
【问题描述】:

我有一个方法接受一堆可选参数,我正在重载该方法以提供不同的签名组合。 Intellisense 会弹出一堆不同的签名,但我认为现在看起来很混乱,因为我需要提供不同的组合,而不仅仅是在方法签名的末尾建立参数。

我是否应该不重载我的方法并坚持一个签名,以便我的方法的用户必须传入空值?它会使签名更清晰,但会使调用代码看起来更混乱。

【问题讨论】:

    标签: c# .net optional-parameters


    【解决方案1】:

    您是否仅限于使用 C# 1-3? C# 4 支持可选参数和命名参数...

    在那之前,您可能应该要么坚持重载创建一个具有可变属性的单独类,例如

    FooOptions options = new FooOptions { Name="Jon", Location="Reading" };
    Foo foo = new Foo(options);
    

    如果你愿意,这一切都可以在一个语句中完成……如果某些属性是强制性的,那么在 FooOptions 中创建一个构造函数,它会接受所有这些属性。

    在 C# 4 中,您可以编写:

    Foo foo = new Foo(name: "Jon", location: "Reading");
    

    如果构造函数写成

    public Foo(string name,
               int age = 0,
               string location = null,
               string profession = null)
    

    命名参数和可选参数应该使在 C# 4 中构造具有可选属性的不可变类型变得更加容易:)

    【讨论】:

    • 是的,在c#2上恐怕要等C#4和可选参数了。
    • 是的,那真的很方便
    【解决方案2】:

    想想c#方法的params参数。

    void test(params object []arg) {
       ..
    }
    

    【讨论】:

    • 几乎肯定是错误的方法:除非所有参数都是相同类型,否则您将失去类型安全性,并且您会失去关于哪个参数意味着什么的任何线索。
    • 这将使您失去类型安全性并需要对值类型进行装箱。两者通常都是不可取的。
    【解决方案3】:

    如果函数定义只有长度不同(而不是顺序,否则这不是最好的方法),您可以使用params keyword。然后在函数中您可以根据参数输入设置您需要的值

    【讨论】:

    • 我会考虑 params 只有当参数是相同的类型。另请参阅 Jon 对另一个答案的评论。
    • 是的,这就是我所说的,只有在类型顺序相同的情况下才能真正起作用。否则,乔恩的答案就是要走的路
    • 这在我的情况下不起作用,因为我需要一个固定的签名。如果我以数组的形式传递一些我需要的数据,比如 string.Format