2010-11-18 2 views
1

Обычно я обнаружил, что у меня есть нулевая ошибка ссылки, вызванная тем, что я забыл инициализировать свойство коллекции в классе. Есть ли способ сделать это автоматически без использования конструктора.можно инициализировать свойство коллекции, когда мы объявляем его в классе

ответ

4
private List<string> _names = new List<string>(); 

public List<string> Names 
{ 
    get {return _names;} 
    set {_names = value;} 
} 

Если вы хотите использовать

public List<string> Names { get; set; } 

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

1

Один из способов:

List<string> myList = new List<string>(); 
+0

Я думаю OP хотел это сделать автоматически компилятором. –

+0

@ icyrock.com, Спасибо, я знаю это, и, как я покажу, компилятор НЕ сделает это. – Gabe

1
public class Foo { 
    List<int> list = new List<int>(); 

    // details elided 
} 

Теперь list никогда не null, когда любой из ваших методов экземпляра выполняются.

1

Его спросили без конструктора, поэтому я думаю, что ответ отрицательный. Я рисую, что он, возможно, ищет способ, которым вы (неточно) воспринимаете класс C++, объявленный в стеке против кучи, - то, как вы обрабатываете переменную в стеке дает иллюзию, что конструктор не вызывается, когда вы смотрите на него синтаксически на языки, которые не имеют указателей и ссылок на объекты.

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

Редактировать: но действительно - почему? Напишите несколько модульных тестов, чтобы утверждать, что нет нулей или чего-то еще. Забытие на создание переменных-членов поражает меня как очень низкое из-за того, что мне нужно сделать для меня и именно так, как я хочу. Тотем

1

Тонкая вариация, которая препятствует построению списков, полезна для некоторых сценариев, связанных с WCF (который пропускает как конструктор и инициализаторов полей) без необходимости десериализации обратных вызовов:

public class MyType 
{ 
    private List<string> items; 
    public List<string> Items { get { 
     return items ?? (items = new List<string>()); } } 
} 
Смежные вопросы