Raddoppia se altro problema in C #
-
06-07-2019 - |
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
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.