Значение по умолчанию свойства - PullRequest
2 голосов
/ 26 февраля 2009

Если у вас есть такой объект:

public class Foo
{
    private int _id;

    public int id
    {
        get { return _id; }
        set { _id = value; }
    }

    private string _name;

    public string name
    {
        get { return _name; }
        set { _name = value; }
    }
}

И вы хотите инициализировать идентификатор в -1 и имя в String.Empty, что является лучшим методом? (и почему)

Выполнение:

private int _id = -1

или

Установка _id = -1 и name = String.Empty в конструкторе?

Ответы [ 7 ]

7 голосов
/ 26 февраля 2009

Это больше вопрос стиля, чем что-либо еще. Есть только несколько случаев, когда это функциональная проблема

  1. Когда у вас много конструкторов, которые инициализируют поля одним и тем же значением. В этот момент у вас есть избыточный код, и вы должны либо реорганизовать ваши конструкторы, либо использовать инициализаторы полей.
  2. Не используйте инициализатор полей, если он зависит от значения другого поля в той же иерархии классов. В отсутствие частичных классов результат предсказуем, но все же может бросить людей в петлю.
2 голосов
/ 26 февраля 2009

Полевой подход является лаконичным, который получает много голосов, но я бы предпочел (для простых свойств) использовать авто-свойства, и в этом случае вы вынуждены использовать конструктор:

    public Foo() {
        Id = -1;
        Name = "";
    }
    public int Id {get;set;}
    public string Name {get;set;}

Вы также можете рассмотреть возможность использования [DefaultValue(-1)] и т. Д., Что помогает дизайнерам и сериализаторам, но это не влияет на начальное значение автоматически реализуемого свойства (или обычного свойства) - это только дополнительная информация .

2 голосов
/ 26 февраля 2009

зависит от того, когда вы хотите установить его ...

private int _id = -1

инициализирует _id перед вызовом конструктора.

0 голосов
/ 26 февраля 2009

Это в основном вопрос стиля предпочтения. Я обычно назначаю их в конструкторе, потому что это нормальное место для всех данных и процедур, которые имеют место при создании объекта.

0 голосов
/ 26 февраля 2009

Встроенная инициализация добавляется в начало конструктора компилятором C #, так что на самом деле нет никакой разницы. Лично я предпочитаю всегда добавлять конструкторы, даже если это только конструктор по умолчанию.

0 голосов
/ 26 февраля 2009

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

0 голосов
/ 26 февраля 2009

Мне кажется, что установка "inline" вместо использования конструктора лучше указывает на намерение. Функционально они одинаковы.

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