Подтвердить что ты не робот

Инструкция 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?

4b9b3361

Ответ 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