Я надеюсь, что это не спросили прежде.
У меня есть nullable булевская переменная, названная boolIsAllowed и если условие как так:
if(boolIsAllowed.HasValue && boolIsAllowed.Value)
{
//do something
}
Моим вопросом является этот хороший код, или я лучше разделил бы его на вложенный если оператор? Будет второе условие проверяться если boolIsAllowed. HasValue равен лжи, и затем выдайте исключение?
Я надеюсь, что этот вопрос не слишком глуп.
Заранее спасибо.
Всё нормально как есть. Второе условие не будет проверяться , если HasValue
ложно, поэтому исключение не будет. Это похоже на такие вещи:
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)
РЕДАКТИРОВАТЬ: Как отмечено в комментариях, это применимо только к && и || - it не применяется к & и |, которые всегда оценивают оба операнда.
Это безопасно. C # сокращает логические выражения, поэтому:
if (list! = Null && list.Count> 0)
Работает. Код не будет пытаться оценить второе условие, потому что знает, что оно не может быть истинным, поскольку первый результат был ложным.
Не все языки делают это, многие делают. В VB.NET вы должны делать это явно с помощью OrElse и AndAlso.
В общем, если у вас есть несколько условий в операторе if, подумайте о том, чтобы извлечь их в метод. В данном конкретном случае в этом нет необходимости, как показали некоторые другие ответы. Но это может быть намного проще в более сложных случаях. Вы бы предпочли поддерживать:
if (taxApplied && taxValue > minimumTax && customerIsPreferred)
{
// Do something
}
или
if (CustomerGetsTaxRebate())
{
// Do Something
}
вы можете просто сделать это:
if(boolIsAllowed.GetValueOrDefault(false))
{
}
Но ваш исходный код не будет генерировать исключение, потому что, если первый тест завершится неудачно, тогда весь тест будет сброшен, потому что && является 'и также', поэтому, если первый тест ложный , тест не может быть успешным.
Второй операнд оценивается, только если первый операнд равен true. Нет необходимости вкладывать if
операторы.
Вы можете проверить истинное значение, даже если оно равно null:
bool? val = null;
if( val == true ) // Works
{
//do something
}