2010-11-01 2 views
14

Представьте, что у вас есть поле _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>(); 
    } 
} 

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

Благодаря

+2

возможный дубликат (HTTP: // StackOverflow. com/questions/40730/how-do-you-give-ac-auto-property-a-default-value) –

ответ

19

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

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

EDIT: Оба чтения автоматически реализованы свойства и определение начального значения, которые должны стать в C# 6.

+0

Это действительно так. Но давайте посмотрим на это с хорошей стороны. У нас есть авто-набор. Только это делает меня счастливым. – Proclyon

+1

Да, я бы * любил * быть в состоянии набрать 'IList {get; частный набор; } = новый Список (); 'или что-то подобное. –

+0

@ Фредрик, это было именно то, на что я надеялся. Возможно, это было бы хорошей возможностью просить в C# 5? –

0

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

0

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

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

0

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

0

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

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

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

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

0

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

3

В C# 6 вы можете написать что-то вроде этого: [? Как вы даете C# Auto-свойства значение по умолчанию]

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

Наконец-то это было добавлено в C# !!! Спасибо, спасибо. – lukiller

Смежные вопросы