В вашем примере вы можете иметь две различные причины для NullReferenceException
:
- Value `user` is null;
- `user.FirstName` is null.
Я предполагаю, что вы проверили уже, если user
не равно нулю, так что позволяет пропустить этот один.
Теперь допустим, что user.FirstName
имеет значение null, что происходит?
Первое условие string.IsNullOrWhiteSpace(user.FirstName)
приведет к true
. Достаточно ли этого для того, чтобы оператор if выполнял внутренний блок кода или должен также быть оценено второе условие?
Давайте посмотрим на эту истину стол:
A && B = RESULT
--------------------
False False = False
False True = False
True False = False
True True = True
So при использовании &&
-оператором общее условие только справедливо, когда оба subconditions истинны. Поэтому, когда первое условие истинно, второе еще нужно оценить. Простой перевод истины таблицы в соответствии с C# будет (где ??? означает: Не важно):
A && B = RESULT
--------------------
False ??? = False
True False = False
True True = True
Так при проверке второго условия, то свойство user.FirstName.Length
читается, в результате чего ваш NullReferenceException
.
Как предотвратить это. Как и другие люди заявляли, вы, вероятно, хотите, чтобы выполнить блок кода, если: FirstName
является NULL ИЛИ Empty ИЛИИЛИ Пробел больше, чем 64. Текущие проверки состояние, в основном, если FirstName является NULL И больше чем 64.
Итак ... использовать || -оператора:
if (string.IsNullOrWhiteSpace(user.FirstName) || !(user.FirstName.Length <= 64))
или более четкое:
if (string.IsNullOrWhiteSpace(user.FirstName) || (user.FirstName.Length > 64))
C# истины стол будет:
A || B = RESULT
--------------------
False False = False
False True = True
True ??? = True
В котором вы можете Клирю видеть «короткое замыкание» часть.
Основная проблема. Что второй критерий не называется или что критерий бросает исключение NullReferenceException, чего вы не ожидали? –
Почему 9 голосов? –
Я думаю, что вопрос непонятен, и ОП не отвечает. –