Вложенный, если операторы или нет

Я надеюсь, что это не спросили прежде.

У меня есть nullable булевская переменная, названная boolIsAllowed и если условие как так:

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

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

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

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

6
задан Riain McAtamney 17 June 2010 в 09:53
поделиться

7 ответов

Всё нормально как есть. Второе условие не будет проверяться , если 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 не применяется к & и |, которые всегда оценивают оба операнда.

18
ответ дан 8 December 2019 в 02:45
поделиться

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

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

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

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

0
ответ дан 8 December 2019 в 02:45
поделиться

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

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

или

if (CustomerGetsTaxRebate())
{
  // Do Something
}
1
ответ дан 8 December 2019 в 02:45
поделиться

А как насчет:

if (boolIsAllowed ?? false)
{
}
6
ответ дан 8 December 2019 в 02:45
поделиться

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

if(boolIsAllowed.GetValueOrDefault(false))
{

}

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

0
ответ дан 8 December 2019 в 02:45
поделиться

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

0
ответ дан 8 December 2019 в 02:45
поделиться

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

bool? val = null;
if( val == true ) // Works
{
  //do something
}
8
ответ дан 8 December 2019 в 02:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: