Что вы думаете о??= оператор в C#?

Вы думаете, что C# будет поддерживать что-то вроде оператора??=?

Вместо этого:

if (list == null)
  list = new List<int>();

Можно было бы написать:

list ??= new List<int>();

Теперь я мог бы использовать (но это кажется мне не очень хорошо читаемым):

list = list ?? new List<int>();

5 ответов

Решение

Я всегда хотел что-то подобное. Я бы использовал его гораздо чаще, чем ?? само собой.

Однако то, что я действительно хочу, это форма оператора, которая позволяет разыменовывать объект, только если он не равен нулю. Чтобы заменить это:

    int count = (list != null)? list.Count : 0

с чем-то вроде этого:

    int count = list??.Count : 0

Что было бы особенно полезно для меня с длинными цепочками ссылок (плохой дизайн, я знаю), но, например,

    int count = foo??.bar??.baz??.list??.Count : 0

В настоящее время это невозможно с ?? потому что вы можете только сказать "назначить для foo или альтернативу, если ноль", но не "назначить для свойства foo, или альтернативу, если ноль".

Лично я думаю, что только второе расширение имеет смысл (с точки зрения сохранения той же линии, что и += так далее):

list = list ?? new List<int>();

но, если честно, я нахожу это немного ненужным. Люди обычно "получают" i += 5;, но, как правило, возникают проблемы с объединением нулей (??). Добавьте оператор нулевого слияния-присваивания и... ну, я не вижу, чтобы он хорошо заканчивался.

Лично я одобряю оригинальный код:

if(list == null) { list = new List<int>(); }
....

Также - учтите: во всех остальных +=, -= и т.д. - правая часть всегда оценивается. В этом случае это не будет (в некоторых случаях). Это добавляет еще больше путаницы. Под этим я подразумеваю:

i += SomethingCriticalThatMustBeCalled(); // fine - always runs
j ??= SomethingElseCriticalThatMustBeCalled(); // is this run? if j != null?

Уловка, которую я нашел где-то здесь в stackru, заключалась в том, чтобы сделать что-то вроде этого...

private List<string> myList;
public List<string> MyProp 
{
    get { return myList ?? (myList= new List<string>()); }
}

... вы можете использовать похожий ленивый eval в своем коде.

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

Если я не прочитал ваш вопрос неправильно, этот оператор существует в C#: http://msdn.microsoft.com/en-us/library/ms173224(VS.80).aspx

Другие вопросы по тегам