在C#中有条件地调用构造函数

Lee*_*ite 9 c# conditional constructor

假设我Foo在C#中有以下构造函数:

public Foo()
{
    // ...
}
protected Foo(bool connect)
    : this()
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

我正在寻找一种只this()connect参数出现时才执行该部件的方法true.这是一种方法吗?

(对于好奇的人:这背后的原因是Foo类创建了连接到某些东西的对象;当它们被创建时,它们应该总是尝试连接.现在,我正在为它创建一个模拟器(或MOCK)扩展Foo类这就是我加入了.protected构造函数;当使用这一块,应该是不会建立实际的连接选项,我想实现这个同时改变Foo类尽可能少).

Ere*_*mez 8

不,你不能this()以这种方式有条件地打电话.但是,您可以将条件代码移动到protected构造函数,只需从中调用该构造函数public:

public Foo() : this(true)
{

}

protected Foo(bool connect)
{
   if(connect) //...
}
Run Code Online (Sandbox Code Playgroud)

  • 我个人赞成这种做法.它避免了调用非构造函数方法的缺点,即"readonly"字段无法在非构造函数中初始化.它还可以扩展到许多构造函数(所有构造函数都可以调用受保护的甚至是私有的"主"构造函数) - 尽管调用init()方法也可以扩展. (2认同)

Bar*_*chs 6

一种方法是创建一个init()函数:

public Foo()
{
    // ...
    init();
}
protected Foo(bool connect)
{
    // ...
    if (connect) {
        init();
    }
}
Run Code Online (Sandbox Code Playgroud)