带有可选参数的C#构造函数

时间:2018-04-18 16:41:00

标签: c#

我对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
            {

            }
    }
}

3 个答案:

答案 0 :(得分:7)

答案是否定的,两者的行为不一样。

第一个代码段不允许您的构造函数决定是否使用a和/或b的默认参数调用它,或者调用者是否故意通过了null。换句话说,有意允许传递null,因为您无法实施有意义的null检查。

这两个代码片段的另一个方面肯定会有所不同 - 使用构造函数通过反射:

  • 第一个代码段将提供一个构造函数。反射调用者需要处理向它传递两个参数,或允许带有绑定标志的可选参数(查看demo提供的Jcl)。
  • 第二个片段将提供三个独立的构造函数。反思呼叫者需要选择他们想要使用的那个。

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