Вопрос

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

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

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

Возможно, было бы возможно написать:

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

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

list = list ?? new List<int>();
Это было полезно?

Решение

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

Однако чего я ДЕЙСТВИТЕЛЬНО хочу, так это формы оператора, которая позволяет разыменовывать объект только в том случае, если он не равен null.Чтобы заменить это:

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

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

    int count = list??.Count : 0

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

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

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

Другие советы

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

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

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

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

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

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

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

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

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

...возможно, вы сможете использовать аналогичную ленивую оценку в своем коде.

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

Если я не неправильно истолковал ваш вопрос, этот оператор действительно существует в C#: http://msdn.microsoft.com/en-us/library/ms173224 (ПРОТИВ 80).aspx

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top