Вложены ли заявления или нет - PullRequest
6 голосов
/ 17 июня 2010

Надеюсь, об этом раньше не спрашивали.

У меня есть логическое значение с логическим значением boolIsAllowed и условие if примерно так:

if(boolIsAllowed.HasValue && boolIsAllowed.Value)
{
 //do something
}

Мой вопрос - это хороший код илиЯ бы лучше разделить его на вложенный оператор if?Будет ли проверено второе условие, если boolIsAllowed.HasValue равно false, а затем выдать исключение?

Надеюсь, этот вопрос не слишком глупый.

Заранее спасибо.

Ответы [ 7 ]

18 голосов
/ 17 июня 2010

Это нормально, как есть. Второе условие не будет проверено , если HasValue ложно, поэтому оно не вызовет исключение. Это похоже на такую ​​вещь:

string name = ...;
if (name != null && name.Length > 5)

Опять же, это нормально - вы не получите исключение NullReferenceException, если name равно нулю, поскольку && закорачивает .

Аналогично || оператор имеет короткое замыкание, но в обратном направлении - там, если левый операнд равен true , общее выражение оценивается как истинное без проверки правого операнда. Например:

// Treat null as if it were an empty string
if (name == null || name.Length == 0)

РЕДАКТИРОВАТЬ: Как отмечено в комментариях, это относится только к && и || - это не относится к & и |, которые всегда оценивают оба операнда.

8 голосов
/ 17 июня 2010

Вы можете проверить истинное значение, даже если оно равно нулю:

bool? val = null;
if( val == true ) // Works
{
  //do something
}
6 голосов
/ 17 июня 2010

А как же:

if (boolIsAllowed ?? false)
{
}
1 голос
/ 17 июня 2010

В более общем случае, если в вашем операторе if есть несколько условий, рассмотрите возможность их извлечения в метод.Это не действительно необходимо в данном конкретном случае, как продемонстрировали некоторые другие ответы.Но это может быть намного проще в более сложных случаях.Вы бы предпочли сохранить:

if (taxApplied && taxValue > minimumTax && customerIsPreferred)
{
  // Do something
}

или

if (CustomerGetsTaxRebate())
{
  // Do Something
}
0 голосов
/ 17 июня 2010

Вы в безопасности, делая это.C # замыкает логические выражения, поэтому:

if (list! = Null && list.Count> 0)

Работает.Код не будет пытаться оценить второе условие, потому что он знает, что оно не может быть истинным, поскольку первый результат был ложным.

Не все языки делают это, так делают многие.В VB.NET вы должны делать это явно с OrElse и AndAlso.

0 голосов
/ 17 июня 2010

Второй операнд оценивается, только если первый операнд имеет значение true.Нет необходимости вкладывать if операторов.

0 голосов
/ 17 июня 2010

Вы можете просто сделать это:

if(boolIsAllowed.GetValueOrDefault(false))
{

}

Но ваш исходный код не будет генерировать исключение, потому что, если первый тест не пройден, тогда весь тест разбивается, потому что && это 'и также', поэтому, если первый тест ложный, тест не может быть успешным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...