6 Stimmen

Verschachtelte if-Anweisungen oder nicht

Ich hoffe, diese Frage wurde nicht schon einmal gestellt.

Ich habe eine nullable Boolean namens boolIsAllowed und eine if-Bedingung wie so:

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

Meine Frage ist dies guter Code oder wäre ich besser trennen es in eine verschachtelte if-Anweisung? Wird die zweite Bedingung geprüft, wenn boolIsAllowed.HasValue gleich false ist, und dann eine Ausnahme ausgelöst?

Ich hoffe, diese Frage ist nicht zu dumm.

Vielen Dank im Voraus.

18voto

Jon Skeet Punkte 1325502

Es ist gut so, wie es ist. Die zweite Bedingung wird nicht geprüft werden, ob HasValue ist falsch, so dass es keine Ausnahme auslöst. Es ist wie diese Art von Sache:

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

Auch das ist in Ordnung - Sie werden keine NullReferenceException erhalten, wenn name ist null, denn && ist Kurzschließen .

Auch der Operator || ist ein Kurzschluss, allerdings in umgekehrter Weise - wenn der linke Operand wahr wird der gesamte Ausdruck als wahr ausgewertet, ohne den rechten Operanden zu überprüfen. Zum Beispiel:

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

EDIT: Wie in den Kommentaren erwähnt, gilt dies nur für && und || - es nicht gelten für & und |, die immer beide Operanden auswerten.

8voto

simendsjo Punkte 4731

Sie können auf den wahren Wert prüfen, auch wenn er null ist:

bool? val = null;
if( val == true ) // Works
{
  //do something
}

6voto

Philippe Leybaert Punkte 161931

Worüber?

if (boolIsAllowed ?? false)
{
}

1voto

AbstractCode Punkte 61

Allgemeiner gesagt, wenn Sie mehrere Bedingungen in Ihrer if-Anweisung haben, sollten Sie diese in eine Methode extrahieren. Dies ist in diesem speziellen Fall nicht wirklich notwendig, wie einige der anderen Antworten gezeigt haben. Aber es kann in komplexeren Fällen viel einfacher sein. Würden Sie es vorziehen zu pflegen:

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

または

if (CustomerGetsTaxRebate())
{
  // Do Something
}

0voto

Andras Zoltan Punkte 41403

Können Sie dies einfach tun:

if(boolIsAllowed.GetValueOrDefault(false))
{

}

Aber Ihr ursprünglicher Code würde keine Ausnahme auslösen, denn wenn der erste Test fehlschlägt, wird der gesamte Test abgebrochen, weil && 'und auch' ist, wenn also der erste Test falsch ist, kann der Test auf keinen Fall erfolgreich sein.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X