Инструкция VB.NET "If" с условным выражением "Or" имеет обе стороны?
Быстрый вопрос, самым быстрым и легким ответом может быть переупорядочение связанного кода, но пусть видит...
Итак, у меня есть оператор If
(фрагмент кода, который является частью полного рабочего решения, написанного на С#), переписанного с использованием VB.NET. Я знаю, что метод VB.NET IIf(a, b, c)
оценивает как b
, так и a
независимо от истинности первой оценки, но это также имеет место и в моей стандартной конструкции:
If (example Is Nothing Or example.Item IsNot compare.Item) Then
'Proceed
End If
Или, скорее, более правильно:
If (example Is Nothing Or Not example.Item = compare.Item) Then
'Proceed
End If
Здесь, если example
- Nothing
(null
), то я все равно получаю NullReferenceException
- это моя ошибка, или это то, что мне просто нужно терпеть по прихоти VB.NET?
Ответы
Ответ 1
Это ваша "ошибка" в том, что определяется Or
, поэтому вы должны ожидать поведение:
В булевом сравнении оператор Or всегда оценивает оба выражения, которые могут включать в себя вызовы процедур. Оператор OrElse (Visual Basic) выполняет короткое замыкание, а это означает, что если выражение1 является True, то выражение2 не оценивается.
Но вам не нужно этого терпеть. Вы можете использовать OrElse
, чтобы получить короткое замыкание.
Итак, вы, вероятно, захотите:
If (example Is Nothing OrElse Not example.Item = compare.Item) Then
'Proceed
End If
Я не могу сказать, что он читается ужасно красиво, но он должен работать...
Ответ 2
OrElse
- это короткозамкнутый эквивалент Or