Что вы думаете о??= оператор в 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