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