2017-01-03 10 views
1

Для того, чтобы убедиться в том, что свойство списка никогда не будет возвращать нуль, я объявил об этом так:C# ярлык для свойства списка, который никогда не должен возвращать нуль

private IList<Item> _myList; 

    [NotNull] 
    public IList<Item> MyList 
    { 
     get { return _myList ?? new List<Item>(); } 
     set { _myList = value; } 
    } 

Это работает, но я ненавижу синтаксис. Учитывая, что я должен широко использовать эту технику во всем моем проекте, я ищу лучший способ написать это или лучшее решение той же проблемы. Есть идеи?

+0

'частное IList только для чтения _myList = новый список ()' это будет гарантировать, что это никогда не нулевой – Ric

+0

Поправьте меня, если я ошибаюсь, но даже если вы инициализировать _myList как новый список, это не значит, что его после этого значение не может быть установлено на значение null. – tocqueville

+0

@tocqueville true, его можно только затем установить в конструкторе класса. – Ric

ответ

4

Это хороший способ сделать это, но каждый раз, когда требуется MyList, и _myList имеет значение null, вы создадите новый пустой список ... Итак, если _myList пуст, а кто-то делает MyList.Add(item);, он не будет добавлен в нужный список.

Лучше сделать это:

private IList<Item> _myList; 

[NotNull] 
public IList<Item> MyList 
{ 
    get { return _myList ?? (_myList = new List<Item>()); } 
    set { _myList = value; } 
} 

Таким образом, первый раз _myList имеет нулевое значение, вы создаете новый список. Тогда _myList не будет пустым.

+0

Этот код недействителен – tocqueville

+0

Хороший вопрос о вызове '.Add()', когда элемент поддержки является «null». Код OP имеет существенную ошибку в этом отношении, поскольку потребительский код не имеет понятия, что используемый список немедленно отбрасывается. Все разговоры о других ответах о том, что «это будет вести себя по-другому», по-видимому, игнорируют то, что текущее поведение нарушено. – David

+0

@ David Я сделал .... –

0

Начиная с C# 6.0 вы можете инициализировать свойства, которые используют автоматически реализованное поле. Это гарантирует, что MyList никогда не нулевое значение:

public IList<Item> MyList { get; set; } = new List<Item>(); 
+1

См. Комментарии к Zohar Peled, это очень отличается от моего кода – tocqueville

0

Это работает, но я ненавижу синтаксис.

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

Действительно ли возвращаемое значение действительно не может быть обнулено? Если да, то создать правильный экземпляр вместо отбрасывания это в тот момент ее создание:

[NotNull] 
public IList<Item> MyList 
{ 
    get { return _myList ?? (_myList = new List<Item>()); } 
    set { _myList = value; } 
} 

Если вы жизнь с обнуляемым списком, вы можете просто хотите обсчитывать нуль-проверку:

if (list?.Contains(...) ?? false) 
{ }