8

给定以下课程:

public class MyClass
{
    private string _param;

    public MyClass ()
    {
        _param = string.Empty;
    }

    public MyClass (string param)
    {
        _param = param;
    }
}

我在链接这些构造函数的两种方法之间被撕裂:

第一个

public MyClass () : this (string.Empty)
{
}

public MyClass (string param)
{
    _param = param;
}

第二个:

public MyClass ()
{
    _param = string.Empty;
}

public MyClass (string param) : this ()
{
    _param = param;
}

那么,从无参数构造函数中链接更好还是相反?

4

7 回答 7

13

以你的例子,我会走第一种方式。第二个实际上并没有消除您可能试图避免的任何代码重复,因为您仍然必须显式设置_param. 第二种this()方法中的空调用是完全免费的。

于 2009-09-22T17:58:57.483 回答
4

我更喜欢第一个。这样,构造函数的行为将始终是连贯的和可预测的,而且它减少了代码重复。

于 2009-09-22T17:59:07.403 回答
3

从 pramater less 到 pramater 的链条,

因此从具有默认值的出租参数构造函数调用更多参数

public MyClass()
{
    MyClass(default value here);
}

public Myclass(value)
{
    _value = value;
}
于 2009-09-22T18:00:07.043 回答
1

我想从较小到较大的链接总是更好,即为什么在将默认值(string.Empty)传递给参数化构造函数更有意义时,为什么在构造函数中分配一个空字符串然后分配一个给定字符串。

于 2009-09-22T18:01:11.987 回答
1

我也更喜欢第一个。就像在从简单基类继承的复杂派生类中一样,您希望“复杂”构造函数建立在“基本”构造函数的功能之上。

于 2009-09-22T18:03:57.627 回答
1

在您的情况下,第二个示例确实没有意义,因为您重复了类成员的分配(如果您使用MyClass (string param)构造函数)。

如果链式构造函数正在“添加功能”,则第二种方法更有用。

例子:

public MyClass ()
{
    _param0 = string.Empty;
}

public MyClass (string param1) : this ()
{
    _param1 = param1;
}

public MyClass (string param1, string param2) : this (param1)
{
    _param2 = param2;
}

在您的特定情况下,第一个示例显然更合适,因为您只有一个分配给同一个成员。

于 2009-09-22T18:24:31.697 回答
0

如果您在此处将您的目标声明为“在未指定值时提供默认值”,那么您应该清楚地使用第一种方法。

然后一般规则是:从最不具体的构造函数到最具体的构造函数。

于 2009-09-22T18:02:38.020 回答