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

本文关键字:调用 构造函数 有条件 | 更新日期: 2023-09-27 18:15:23

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

public Foo()
{
    // ...
}
protected Foo(bool connect)
    : this()
{
    // ...
}

我正在寻找一种方法,只要connect参数是true,就只执行this()部分。这是一种方法吗?

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

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

不,您不能以这种方式有条件地调用this()。但是,您可以将条件代码移动到protected构造函数中,然后从public构造函数中调用该构造函数:

public Foo() : this(true)
{
}
protected Foo(bool connect)
{
   if(connect) //...
}

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

public Foo()
{
    // ...
    init();
}
protected Foo(bool connect)
{
    // ...
    if (connect) {
        init();
    }
}

你不能有条件地调用this()所以你必须使用一个方法来代替

public Foo()
{
    ConnectCode();
}
protected Foo(bool connect)
    : this()
{
    if(connect)
        ConnectCode();
}

另一种方法(不知道它是否好或是否适合你的需要)是:

public Foo(bool connect=true)
{
    if(connect)
        ConnectCode();
}

这样调用Foo()的代码不需要修改,但是你失去了受保护的可访问性