我有以下情况:
构造函数需要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);
除了使用方法重载(这将是乏味的)这样做,是否有更优雅的解决方案?
答案 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);
有关命名和可选参数的更多信息,请点击此处:
答案 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编译器......