О чем Вы думаете?? = оператор в C#? [закрытый]

10
задан 2 revs, 2 users 100% 7 April 2010 в 00:44
поделиться

5 ответов

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

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

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

на что-то вроде этого:

    int count = list??.Count : 0

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

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

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

{{ 1}}
4
ответ дан 3 December 2019 в 15:35
поделиться

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

3
ответ дан 3 December 2019 в 15:35
поделиться

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

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?
16
ответ дан 3 December 2019 в 15:35
поделиться

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

1
ответ дан 3 December 2019 в 15:35
поделиться

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

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

... возможно, вы сможете использовать подобный ленивый eval в своем коде.

4
ответ дан 3 December 2019 в 15:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: