Сокращение от вложенного пустого указателя, проверяющего C#

Насколько я знаю, что нет значительно более изящного способа записать следующее....

string src;
if((ParentContent!= null)
    &&(ParentContent.Image("thumbnail") != null)
    &&(ParentContent.Image("thumbnail").Property("src") != null))
    src = ParentContent.Image("thumbnail").Property("src").Value

Вы думаете, что должна быть функция языка C# для создания этого короче?
И если так, на что это должно быть похожим?
например, что-то как расширение?? оператор

string src = ParentContent??.Image("thumbnail")??.Property("src")??.Value;

Извинения за скорее изобретенный пример и мое упрощенное решение.

Редактирование... Много лет спустя
Это - теперь функция планового языка, названная "Пустым оператором распространения" ?. https://roslyn.codeplex.com/discussions/540883 (Спасибо @Brian)

21
задан Myster 22 May 2014 в 04:08
поделиться

3 ответа

Для этого нет встроенного синтаксиса, но вы можете определить метод расширения для этого:

R NotNull<T, R>(this T src, Func<T, R> f) 
    where T : class where R : class {
  return src != null ? f(src) : null;
}

Теперь вы можете переписать свой пример следующим образом:

src = ParentContent.NotNull(p => p.Image("thumbnail")).
        NotNull(i => i.Property("src")).NotNull(src => src.Value);

Это не так хорошо, как могло бы быть с синтаксической поддержкой, но я бы сказал, что это намного более читабельно.

Обратите внимание, что это добавляет метод NotNull ко всем типам .NET, что может быть немного неудобно. Вы можете решить эту проблему, определив простой тип оболочки WrapNull , где T: class , содержащий только значение типа T и метод преобразования любого ссылочного типа в WrapNull и предоставление NotNull в типе WrapNull . Тогда код будет выглядеть так:

src = WrapNull.Wrap(ParentContent).NotNull(p => p.Image("thumbnail")).
        NotNull(i => i.Property("src")).NotNull(src => src.Value);

(Чтобы вы не загрязняли IntelliSense каждого типа новым методом расширения)

Приложив немного больше усилий, вы также можете определить операторы запроса LINQ для этого. Это немного излишне, но это можно написать (я не буду включать сюда определения, поскольку они немного длиннее, но это возможно, если кому-то интересно :-)).

src = from p in WrapNull.Wrap(ParentContent)
      from i in p.Image("thumbnail").
      from src in i.Property("src")
      select src.Value;
18
ответ дан 29 November 2019 в 20:03
поделиться

Это было предложено и очевидно отклонено командой:

Немного больше синтаксического сахара C # для нулей

Предлагаемый синтаксис выглядел бы так a.?b.?c () - очень полезно и однозначно.

Мне тоже очень хотелось бы это увидеть, но, похоже, этого не произойдет. Может быть, если за него проголосует достаточное количество людей!

16
ответ дан 29 November 2019 в 20:03
поделиться

Мы рассматривали его для C # 4, но не располагали бюджетом. Это хорошая функция, которую запрашивают многие люди, поэтому, возможно, мы добавим ее в будущую версию на гипотетическом языке. Не обещаю.

15
ответ дан 29 November 2019 в 20:03
поделиться
Другие вопросы по тегам:

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