Что вы думаете по поводу ??= operator в C #?[закрыто]
-
23-09-2019 - |
Вопрос
Как вы думаете, 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