В C #, что является лучшим / приемлемым способом создания цепочки конструктора? - PullRequest
8 голосов
/ 22 сентября 2009

Дан следующий класс:

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 голосов
/ 22 сентября 2009

На вашем примере я бы пошел первым путем. Второй фактически не устраняет никакого дублирования кода, которого вы, вероятно, пытаетесь избежать, поскольку вам все еще нужно явно установить _param. Пустой вызов this() во втором подходе совершенно бесплатный.

4 голосов
/ 22 сентября 2009

Я предпочитаю первое. Поведение конструкторов всегда будет последовательным и предсказуемым, плюс это уменьшает дублирование кода.

3 голосов
/ 22 сентября 2009

Цепочка от праматера меньше до праматера,

вызов из конструкторов параметров арендодателя с значениями по умолчанию дополнительных параметров

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

public Myclass(value)
{
    _value = value;
}
1 голос
/ 22 сентября 2009

Второй пример в вашем случае действительно не имеет смысла, поскольку вы дублируете присваивание члена класса (если вы используете 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 голос
/ 22 сентября 2009

Я предпочитаю и первое. Как и в случае сложного производного класса, наследуемого от простого базового класса, вы хотите, чтобы «сложный» конструктор основывался на функциональности «базового».

1 голос
/ 22 сентября 2009

Я полагаю, что всегда лучше переходить от меньшего к большему, т. Е. Зачем назначать пустую строку, а не заданную строку в конструкторе, когда имеет смысл передать значение по умолчанию (string.Empty) параметризованному конструктору.

0 голосов
/ 22 сентября 2009

Если вы сформулируете здесь свою цель как «предоставление значения по умолчанию, когда значение не указано», то вам следует четко использовать первый подход.

Тогда общее правило будет следующим: цепочка от наименее специфичного конструктора к наиболее специфичному.

...