在C#中,实现构造函数链的最佳/被接受的方式是什么?

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;
}

那么,从无参构造函数开始链接还是反过来更好?
7个回答

13

根据您的示例,我会选择第一种方式。第二种方式实际上并没有消除您想要避免的任何代码重复,因为您仍然需要明确设置_param。第二种方法中空的this()调用是完全无意义的。


确实,这似乎是大家的共识。 - Stécy

4

我更喜欢第一种方法。这样构造函数的行为总是连贯和可预测的,并且它减少了代码重复。


3
从无参数到有参数进行链接,因此可以使用具有默认值的较少参数构造函数来调用更多参数。请注意保留HTML标记。
public MyClass()
{
    MyClass(default value here);
}

public Myclass(value)
{
    _value = value;
}

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;
}

在你的特定情況下,第一個例子顯然更適合,因為你只有對同一成員的一次分配。

1
我认为总是最好从小到大进行链式操作,即为什么在构造函数中先赋值为空字符串再赋值给定字符串,而不是将默认值(string.Empty)传递给参数化的构造函数,这样更有意义。

1
我也喜欢第一个。就像在一个复杂的派生类继承自一个简单的基类时,你希望“复杂”的构造函数能够建立在“基本”功能的基础上。

0
如果你在这里的目标是“在未指定值时提供默认值”,那么你应该明确使用第一种方法。
通常的规则是:从最不具体的构造函数链到最具体的构造函数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接