Что вы думаете о? = Operator в С#?
Считаете ли вы, что С# будет поддерживать что-то вроде: = operator?
Вместо этого:
if (list == null)
list = new List<int>();
Можно написать:
list ??= new List<int>();
Теперь я мог бы использовать (но мне кажется, что он не читается):
list = list ?? new List<int>();
Ответы
Ответ 1
Я всегда хотел чего-то подобного. Я бы использовал его гораздо чаще, чем ??
сам по себе.
То, что я действительно хочу, однако, является формой оператора, которая позволяет разыменовывать объект только в том случае, если он не равен нулю. Чтобы заменить это:
int count = (list != null)? list.Count : 0
с чем-то вроде этого:
int count = list??.Count : 0
Что было бы особенно полезно для меня с длинными цепочками ссылок (плохой дизайн, я знаю), но, например,
int count = foo??.bar??.baz??.list??.Count : 0
В настоящее время это невозможно с ??
, потому что вы можете только сказать "присваивать foo или альтернативе, если null", но не "присваивать свойство foo или альтернативу, если null".
Ответ 2
Лично я думаю, что только второе расширение имеет смысл (с точки зрения сохранения в той же строке, что и +=
и т.д.):
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?
Ответ 3
Трюк, который я нашел где-то здесь, в stackoverflow, должен был сделать что-то вроде этого...
private List<string> myList;
public List<string> MyProp
{
get { return myList ?? (myList= new List<string>()); }
}
... возможно, вы можете использовать подобный ленивый eval в своем коде.
Ответ 4
Мне нравится - это приятный, лаконичный способ выражения ленивого выражения. Вне зависимости от того, добавляется ли он на язык, совсем другое - как Эрик Липперт любит указывать, новые функции требуют значительных усилий для реализации и поэтому они должны внести значительный положительный результат в язык для включения.
Ответ 5
Если я не прочитал ваш вопрос неправильно, этот оператор существует в С#: http://msdn.microsoft.com/en-us/library/ms173224(VS.80).aspx