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

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