При инициализации в конструкторах C# что лучше: списки инициализаторов или назначение?

класс A использует список инициализаторов, чтобы задать члену значение параметра, в то время как класс B использует назначение в теле конструктора.

может ли кто - нибудь дать какую-либо причину предпочесть один над другим, пока я последователен?

class A
{
    String _filename;

    A(String filename) : _filename(filename)
    {
    }
}


class B
{
    String _filename;

    B(String filename)
    {
        _filename = filename;
    }
}

3 ответов


первый не является законным в C#. Только два элемента, которые могут появиться после двоеточия в конструкторе, являются base и this.

поэтому я бы пошел со вторым.


вы имели в виду C++ вместо c#?

для C++ списки инициализаторов лучше, чем назначение по нескольким причинам:

  • для типов стручка (int, поплавок, etc..) оптимизатор часто может сделать более эффективный memcpy за кулисами, когда вы предоставляете инициализаторы для данных.
  • для типов non-POD (объектов), вы получаете эффективность только путем делать одну конструкцию. С присваивания в конструкторе, компилятор должен сначала построить объект, а затем назначьте его на отдельном шаге (это относится и к типам POD).

C# имеет функцию под названием Объект Инициализатор. Можно указать значения, которые компилятор будет использовать для инициализации указанных членов, и вызвать конструктор по умолчанию. Для этого вам нужно иметь открытый конструктор по умолчанию.