В C # скажите, что вы хотите извлечь значение из PropertyC в этом примере, а ObjectA, PropertyA и PropertyB могут иметь значение NULL.
ObjectA.PropertyA.PropertyB.PropertyC
Как я могу безопасно получить PropertyC с наименьшим количеством кода?
Прямо сейчас проверю:
if(ObjectA != null && ObjectA.PropertyA !=null && ObjectA.PropertyA.PropertyB != null)
{
// safely pull off the value
int value = objectA.PropertyA.PropertyB.PropertyC;
}
Было бы неплохо сделать что-то еще подобное (псевдокод).
int value = ObjectA.PropertyA.PropertyB ? ObjectA.PropertyA.PropertyB : defaultVal;
Возможно, еще больше обрушился с оператором объединения с нулем.
РЕДАКТИРОВАТЬ Изначально я сказал, что мой второй пример похож на js, но я изменил его на псевдокод, поскольку было правильно указано, что он не будет работать в js.
ObjectA
илиPropertyA
равны нулю.Ответы:
В C # 6 вы можете использовать условный оператор Null . Итак, исходный тест будет:
источник
value
равно, еслиPropertyC
равно нулю? или еслиPropertyB
нуль? что еслиObject A
ноль?null
. Он начинается слева направо. Без синтаксического сахара это эквивалентно серии операторов if, гдеif(propertyX == null) {value = null} else if (propertyY == null){ value = null} else if......
конечным последним выражением являетсяif(propertyZ != null) { value = propertyZ }
Метод короткого удлинения:
С помощью
Этот простой метод расширения и многое другое вы можете найти на http://devtalk.net/csharp/chained-null-checks-and-the-maybe-monad/
РЕДАКТИРОВАТЬ:
После его использования я думаю, что правильное имя для этого метода должно быть IfNotNull () вместо оригинального With ().
источник
Можете ли вы добавить метод в свой класс? Если нет, думали ли вы об использовании методов расширения? Вы можете создать метод расширения для вашего типа объекта под названием
GetPropC()
.Пример:
Использование:
Кстати, это предполагает, что вы используете .NET 3 или выше.
источник
То, как вы это делаете, правильно.
Вы можете использовать трюк, подобный описанному здесь , используя выражения Linq:
Но это намного медленнее, чем вручную проверять каждое свойство ...
источник
Выполните рефакторинг, чтобы соблюсти закон Деметры
источник
Обновление 2014: в C # 6 появился новый оператор,
?.
называемый «безопасная навигация» или «распространение нуля».Прочтите http://blogs.msdn.com/b/jerrynixon/archive/2014/02/26/at-last-c-is-getting-sometimes-called-the-safe-navigation-operator.aspx подробности
Это очень популярный запрос уже давно https://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/3990187-add-operator-to-c-?tracking_code=594c10a522f8e9bc987ee4a5e2c0b38d
источник
Очевидно, вы ищете Nullable Monad :
становится
Это возвращается
null
, если какое-либо из свойств, допускающих значение NULL, равно NULL; в противном случае значениеValue
.Методы расширения LINQ:
источник
SelectMany
метод расширения используетсяfrom ... in ... from ... in ...
синтаксисом.Предполагая, что у вас есть пустые значения типов, один из подходов будет следующим:
Я большой поклонник C #, но очень хорошая вещь в новой Java (1.7?) - это.? оператор:
источник
Этот код - «наименьшее количество кода», но не лучшая практика:
источник
Когда мне нужно объединить такие вызовы в цепочку, я использую созданный мной вспомогательный метод, TryGet ():
В вашем случае вы бы использовали его так:
источник
Я видел кое-что в новом C # 6.0, это с помощью '?' вместо проверки
например, вместо использования
вы просто используете
Надеюсь, это кому-то помогло.
ОБНОВИТЬ:
Вы могли бы сделать это сейчас
источник
Вы могли сделать это:
Или еще лучше:
источник
вы можете использовать следующее расширение, и я думаю, что это действительно хорошо:
И используется он так:
источник
Я бы написал ваш собственный метод в типе PropertyA (или метод расширения, если он не ваш тип), используя шаблон, аналогичный типу Nullable.
источник
Только что наткнулся на этот пост.
Некоторое время назад я сделал предложение в Visual Studio Connect о добавлении нового
???
оператора.http://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/4104392-add-as-an-recursive-null-reference-check-opera
Это потребует некоторой работы со стороны команды разработчиков фреймворка, но не нужно менять язык, а просто потрудитесь над компилятором. Идея заключалась в том, что компилятор должен изменить этот код (синтаксис не разрешен atm)
в этот код
Для нулевой проверки это может выглядеть как
источник
Я написал метод, который принимает значение по умолчанию, вот как его использовать:
Вот код:
источник
Это невозможно.
ObjectA.PropertyA.PropertyB
завершится ошибкой, если значениеObjectA
равно нулю из-за разыменования нуля, что является ошибкой.if(ObjectA != null && ObjectA.PropertyA
... работает из-за короткого замыкания, т.е.ObjectA.PropertyA
никогда не будет проверяться, еслиObjectA
естьnull
.Первый способ, который вы предлагаете, - самый лучший и самый ясный с намерением. Во всяком случае, вы могли бы попытаться изменить дизайн, не полагаясь на такое количество нулей.
источник
Этот подход довольно прост, если вы преодолеете лямбда-тупицу:
При использовании это может выглядеть так:
источник
В
??
(нуль-коалесценции оператор) означает , что если первый аргументnull
, вместо того, чтобы возвратить второй.источник