Возможно ли инициализировать свойство в точке объявления
Представьте, что у вас есть поле _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>();
}
}
Но это не так удобно, как инициализация полей в точке объявления. Есть ли лучший способ сделать это, без необходимости (без необходимости) вернуть это свойство с помощью частного (инициализированного в точке объявления) поля, например.
Спасибо
Ответы
Ответ 1
Нет, автоматические свойства не позволяют установить начальное значение.
Это раздражает, но такова жизнь. (Это раздражает, что они тоже не могут быть прочитаны только, но это напыщенная речь в течение другого дня.)
РЕДАКТИРОВАТЬ: Оба автоматически обновляемых свойства readonly и указание начального значения должны быть в С# 6.
Ответ 2
В С# 6 вы можете написать примерно следующее:
class C
{
public IList<string> Items {get; set;} = new List<string>();
}
Ответ 3
Нет, это единственный способ.
Ответ 4
Поскольку вы не объявляете поле, когда используете { get; set; }
, вы не можете указать начальное значение.
Итак, вам нужно объявить поле самостоятельно или инициализировать его в конструкторе.
Ответ 5
Использование частного поля поддержки или установка значения в конструкторе являются единственными способами, которые дают исходные значения для свойства.
Ответ 6
Я так не верю - по построению, как вы демонстрируете, это лучший лучший способ, поэтому вам не нужно использовать частного защитника, а затем использовать цепочку конструкторов, чтобы гарантировать, что свойство всегда инициализируется:
public MyClass() { PropA = default_Value; }
public MyClass(params object[] args) : this() { /* other code */ }
Это была бы приятная особенность; но тогда автоматически реализуемые свойства упрощают реализацию свойств по типам; и я не вижу, как вы можете добавить на уровне языка функцию значения по умолчанию для автоматического свойства без кода, выглядящего немного, ну, странно.
Но тогда, почему я не разработчик языка.
Ответ 7
Я боюсь, что невозможно сразу инициализировать свойство auto при его объявлении. И я согласен, что это очень жаль. Я не знаю лучшего способа, кроме конструктора.
См. Также Инициализация авто-свойств С#