如何避免方法重载?

时间:2011-07-11 20:10:38

标签: c# optional-parameters

我有以下情况:

构造函数需要6个值。 其中一些有默认值,有些没有。

#pseudocode# Foo(int a, int b=2, int c=3, int d=4, int e=5, int f){}

我希望能够调用所有可能的组合,而不必总是写出所有6个参数。

#pseudocode# Foo f1 = new Foo(a=1, d=7, f=6);
#pseudocode# Foo f2 = new Foo(a=1, b=9, d=7, f=6);

除了使用方法重载(这将是乏味的)这样做,是否有更优雅的解决方案?

4 个答案:

答案 0 :(得分:12)

在C#4中,命名参数见Named and Optional Arguments (C# Programming Guide)

会导致

new Foo(a: 1, d: 7, f: 6);

另一个解决方案是使用您的defaut值定义构造函数,并使用Object Initializer设置值How to: Initialize Objects by Using an Object Initializer (C# Programming Guide)

new Foo()
{
    a = 1,
    d = 7,
    f = 6
};

答案 1 :(得分:1)

使用以下命名参数:

Foo f1 = new Foo(a: 1, d: 7, f: 6);
Foo f2 = new Foo(a: 1, b: 9, d: 7, f: 6);

有关命名和可选参数的更多信息,请点击此处:

http://msdn.microsoft.com/en-us/library/dd264739.aspx#Y515

答案 2 :(得分:1)

我更希望重构为Parameter Object。类似的东西:

Foo f1 = new Foo (new FooParameters () { B = 7 })

您的FooParamaters类可以封装默认值:

public class FooParameters
{
     public int A { get; set; }
     public int B { get; set; }


     public FooParameters ()
     {
          A = 1;
          B = 2;
     }
}

答案 3 :(得分:0)

2件事:

1)默认参数是从左到右,一旦你开始默认参数,你就不能有非默认参数,所以f必须有默认值(在你的例子中)

2)您可以使用参数命名跳过默认参数:

var f1 = new Foo(5, 9, e: 9, f: 10);

这给出a = 5,b = 9,c =默认值,d =默认值,e =默认值,f = 10

如果你当然使用C#4.0编译器......