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

时间:2013-05-27 07:20:04

标签: c# constructor conditional

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

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

我正在寻找只在this()参数为connect时才执行true部分的方法。这是一种方法吗?

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

3 个答案:

答案 0 :(得分:8)

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

public Foo() : this(true)
{

}

protected Foo(bool connect)
{
   if(connect) //...
}

答案 1 :(得分:6)

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

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

答案 2 :(得分:2)

您无法有条件地调用此(),因此您必须使用方法

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

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

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

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