Вложенные операторы 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 (boolIsAllowed ?? false)
{
}

в более общем случае, если у вас есть несколько условий в операторе 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.