Что лучше при инициализации в конструкторах C #: списки инициализаторов или присваивание? - PullRequest
28 голосов
/ 12 марта 2010

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

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

class A
{
    String _filename;

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


class B
{
    String _filename;

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

Ответы [ 3 ]

78 голосов
/ 12 марта 2010

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

Так что я бы пошел со вторым.

17 голосов
/ 12 марта 2010

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

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

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

C # имеет функцию под названием Object Initializer . Вы можете предоставить значения, которые компилятор будет использовать для инициализации указанных членов, и вызвать конструктор по умолчанию. Чтобы это работало, вам нужен общедоступный конструктор по умолчанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...