Можно ли инициализировать свойство в точке объявления - PullRequest
16 голосов
/ 01 ноября 2010

Представьте, что у вас есть поле _items в классе. Вы можете инициализировать его в точке объявления:

class C
{
  IList<string> _items=new List<string>();
}

Теперь я хочу преобразовать это поле в автоматически сгенерированное свойство, но инициализация теперь недействительна:

class C
{
  public IList<string> Items=new List<string>(); {get; set;} // Invalid
}

Итак, я должен сделать:

class C
{
  public IList<string> Items {get; set;}

  public C
  {
    Items=new List<string>();
  }
}

Но это не так удобно, как инициализация полей в точке объявления. Есть ли лучший способ сделать это, например, без необходимости (без необходимости) возвращать это свойство частным (инициализируется в точке объявления) полем.

Спасибо

Ответы [ 7 ]

19 голосов
/ 01 ноября 2010

Нет, автоматические свойства не позволяют установить начальное значение.

Это раздражает, но такова жизнь.(Это раздражает, что они также не могут быть прочитаны только для чтения. Но это напыщенная речь на другой день.)

РЕДАКТИРОВАТЬ: и автоматически реализованные свойства только для чтения и указание начального значения планируется в C # 6.

5 голосов
/ 18 мая 2017

В c # 6 вы можете написать что-то вроде этого:

class C
{
    public IList<string> Items {get; set;} = new List<string>();
}
0 голосов
/ 01 ноября 2010

Боюсь, что невозможно напрямую инициализировать свойство auto при его объявлении.И я согласен, что это жаль.Я не знаю лучшего способа, чем конструктор.См. Также Инициализация авто-свойств C #

0 голосов
/ 01 ноября 2010

Я не верю, что построение, как вы демонстрируете, является следующим лучшим способом, поэтому вам не нужно использовать частный бэкер, а затем использовать конструктор-цепочку, чтобы гарантировать, что свойство всегда инициализируется:

public MyClass() { PropA = default_Value; }
public MyClass(params object[] args) : this() { /* other code */ }

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

Но вот почему яя не дизайнер языков.

0 голосов
/ 01 ноября 2010

Использование частного вспомогательного поля или установка значения в конструкторе - это единственный способ присвоить начальные значения свойству.

0 голосов
/ 01 ноября 2010

Поскольку вы не объявляете поле при использовании { get; set; }, вы не можете указать начальное значение.

Так что вам нужно объявить поле самостоятельно или инициализировать его в конструкторе.

0 голосов
/ 01 ноября 2010

Нет, это единственный способ.

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