Вложенные операторы if или нет
надеюсь, об этом раньше не спрашивали.
У меня есть nullable boolean называется boolIsAllowed и условие if, как так:
if(boolIsAllowed.HasValue && boolIsAllowed.Value)
{
//do something
}
мой вопрос-это хороший код или мне лучше разделить его на вложенный оператор if? Будет ли проверено второе условие, если boolIsAllowed.HasValue равен false, а затем выдает исключение?
Я надеюсь, этот вопрос не слишком глуп.
спасибо заранее.
7 ответов
это нормально, как есть. Второе условие не если HasValue
является false, поэтому он не будет выдавать исключение. Это что-то вроде:
string name = ...;
if (name != null && name.Length > 5)
опять же, вы не получите исключение NullReferenceException, если name
равно null, потому что & & является короткое замыкание.
аналогично, оператор || имеет короткое замыкание, но обратным образом-там, если левый операнд правда общее выражение к истинным без проверки правого операнда. Например:
// Treat null as if it were an empty string
if (name == null || name.Length == 0)
EDIT: как отмечено в комментариях, это относится только к && и || - it не применить к & и |, которые всегда оценивают оба операнда.
вы можете проверить значение true, даже если оно равно null:
bool? val = null;
if( val == true ) // Works
{
//do something
}
в более общем случае, если у вас есть несколько условий в операторе if, рассмотрите возможность их извлечения в метод. В этом конкретном случае это не обязательно, как показали некоторые другие ответы. Но в более сложных случаях это может быть намного проще. Вы бы предпочли сохранить:
if (taxApplied && taxValue > minimumTax && customerIsPreferred)
{
// Do something
}
или
if (CustomerGetsTaxRebate())
{
// Do Something
}
вы можете просто сделать это:
if(boolIsAllowed.GetValueOrDefault(false))
{
}
но ваш исходный код не будет выдавать исключение, потому что если первый тест завершается неудачей, то весь тест отключается, потому что & & "а также", поэтому, если первый тест ложен, тест не может быть успешным.
второй операнд вычисляется только если первый операнд имеет значение true. Нет необходимости гнездиться if
заявления.
вы в безопасности делает это. Логические выражения коротких замыканий C#, поэтому:
if (список != null & & list.Количество > 0)
строительство. Код не будет пытаться оценить второе условие, потому что он знает, что оно не может быть истинным, поскольку первый результат был ложным.
Не все языки делают это, многие делают. В VB.NET вы должны сделать это явно с OrElse и AndAlso.