Domanda

Mi ritrovo costantemente a scrivere codice simile come nell'esempio seguente:

if (object["Object Name"] != null) {
    if (object["Object Name"] == "Some Value") {
        // Do Statement A
    } else {
        // Do Statement B
    }
} else {
    // Do Statement B
}

Il problema qui è che controllo molto se un oggetto è nullo o no e quindi posso verificarne il contenuto effettivo.

" Dichiarazione B " è sempre lo stesso e nel mio caso di solito è un'istruzione SQL.

Deve esserci un modo migliore per aggirare questo?

Grazie
Stephen

È stato utile?

Soluzione

C'è un corto circuito in C #, quindi puoi fare:

if(null != object && object.name == foo)
  do A
else
  do B

C # valuta sempre prima la prima espressione nell'istruzione condizionale e se ciò fallisce, non prova nient'altro in quella parte dell'istruzione.

Per approfondire questo punto, se si avrà un'operazione costosa nell'istruzione condizionale insieme a una o più operazioni economiche, è bene metterla alla fine se possibile, quindi controllerà l'operazione costosa solo quando ha davvero bisogno. Quindi qualcosa come

if(trivial comparison && trivial comparison && REALLY EXPENSIVE OPERATION)

Ora eseguirà l'operazione costosa solo come ultima risorsa.

Altri suggerimenti

Dato che C # fa corto circuito, sì. Prova questo:

if (object["Object Name"] != null && object["Object Name"] == "Some Value") 
{
    // Do Statement A
} 
else 
{
    // Do Statement B
}

Penso che riscrivere l'if-then-else in questo renderà più bello grazie alla singola dichiarazione B.

if ((object["Object Name"] != null) && (object["Object Name"] == "Some Value")) 
{
    // Do Statement A
} 
else 
{
    // Do Statement B
}

Perché il doppio controllo? Sicuramente ciò sarebbe sufficiente:

if(object["Object Name"] == "Some Value") {
    // Do statement A
} else {
    // Do statement B
}

In un certo senso vedo cosa stai ottenendo con il controllo null, ma l'esempio particolare che dai non lo richiede.

MODIFICA: Ora se invece avessi scritto questo :

if (object != null) {
    if (object["Object Name"] == "Some Value") {
        // Do Statement A
    } else {
        // Do Statement B
    }
} else {
    // Do Statement B
}

allora la soluzione sarebbe:

if(object != null && object["Object Name"] == "Some Value") {
    // Do Statement A
} else {
    // Do Statement B
}

DISCLAIMER: non eseguire il metodo generale di corto circuito.

Bene, potresti creare una funzione separata per eseguire la ricerca, specialmente se la query rimane la stessa. Quindi qualcosa del genere: (pseudocodice in arrivo)

private bool IsNullCheck(string objectName)
{
  if (object["Object Name"] != null)
     return false;
  else
     // statement B
}

if (!IsNullCheck("Object Name") && if(object["Object name"] == "Value") {
   // stuffs

} 
else 
{
        // Do Statement B
}

O simili.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top