我对C#中的构造函数有一个简单的问题。这两个代码片段的行为方式是否相同?
代码段#1:
public class foo
{
public foo(string a = null, string b = null)
{
// do testing on parameters
}
}
代码段#2:
public class foo
{
public foo()
{
}
public foo(string a)
{
}
public foo(string a, string b)
{
}
}
修改 如果我将其添加到代码片段#1?这可能看起来非常糟糕,但我正在努力重构遗留代码,所以我担心如果我这样做会对使用该类的其他部分造成损害。
public class foo
{
public foo(string a = null, string b = null)
{
if (a == null && b == null)
{
// do sth
}else if (a != null && b == null)
{
// do sth
}
if (a != null && b != null)
{
// do sth
}
else
{
}
}
}
答案 0 :(得分:7)
答案是否定的,两者的行为不一样。
第一个代码段不允许您的构造函数决定是否使用a
和/或b
的默认参数调用它,或者调用者是否故意通过了null
。换句话说,有意允许传递null
,因为您无法实施有意义的null
检查。
这两个代码片段的另一个方面肯定会有所不同 - 使用构造函数通过反射:
答案 1 :(得分:2)
没有。尝试使用named arguments。重载版本将无法编译。因为a
在后一种情况下没有给出值。
var test = new foo1(b: "nope");
var test2 = new foo2(b: "nope");//CS7036 : There is no argument given that corresponds to the required formal parameter of
答案 2 :(得分:0)
如果您正在寻找一种创建带有可选参数的对象的方法,只需在类内部创建一个带有可选或命名参数的静态工厂方法:
public class Foo
{
public Foo(string a, string b, string c) { }
public static Foo createInstance(string a = null, string b = null, string c = null) => new Foo(a, b, c);
}