2010-03-14 8 views
6

Qual è un modo elegante di scrivere questo?Controllo elegante per null e uscita in C#

changeColor() è una funzione vuoto e la funzione che esegue il codice sopra è una funzione void pure.

+0

Inoltre, una cosa del genere, se c'è una possibilità che lastSelection potrebbe cambiare, è necessario memorizzare il valore corrente in un locale o utilizzare un modello di oggetto nullo per la mia risposta. In caso contrario, si sta ancora rischiando un'eccezione di riferimento null se lastSelection cambia tra "if" e quando lo si utilizza. – kyoryu

risposta

14

È possibile ridurre l'ingombro invertendo la condizione:.

if (lastSelection == null) 
{ 
    MessageBox.Show("No Selection Made"); 
    return; 
} 

lastSelection.changeColor(); 
+0

Ha! Beh, +1 ovviamente :) – overslacked

9

Anche se io personalmente piace davvero avere più istruzioni return in una funzione, in base alla programmazione difensiva che ho visto, che ci si intrappolare la condizione di errore e di uscita, e lasciate che qualsiasi altra cosa attraverso:

if(lastSelection == null) 
{ 
    MessageBox.Show("No Selection Made"); 
    return; 
} 

lastSelection.changeColor(); 

E 'difficile dire come mi piacerebbe fare questo nel mio lavoro senza vedere l'intera funzione questo appartiene a

+0

:-) Due menti che entrano nella stessa soluzione allo stesso tempo. Il tuo ha più commenti però. – Bevan

2

Sarei tentato di verificare che lastSelection non sia mai stato null e che punti a un oggetto "vuoto" nei casi in cui sarebbe nullo nel progetto corrente. Quindi, non è necessario un controllo nulla. Progettare eventuali errori fuori dal sistema è sempre una buona pratica.

IOW, chiederei se l'ineleganza nel codice è come si effettua il controllo Null o se è il fatto che sia richiesto un controllo Null su tutti.

+0

Un controllo "nullo" potrebbe non essere richiesto, ma questo sembra essere il codice dell'interfaccia utente, e potrebbe essere bello dire all'utente "Nessuna selezione effettuata" se non è stata effettuata alcuna selezione. In tal caso, anche utilizzando il modello oggetto nullo, sarebbe necessario verificare l'oggetto nullo per poterlo comunicare all'utente. –

+2

@John Saunders: E poi chiederei perché l'opzione di cambiare colore esistesse anche se non fosse un'azione praticabile - in tal caso, preferirei bloccare l'azione disabilitando il controllo/qualsiasi cosa prima che arrivasse anche a questo codiceIn alternativa, l'oggetto nullo può attivare la finestra di messaggio per apparire, direttamente o indirettamente (es: tramite un evento sull'oggetto collegato al codice nell'interfaccia utente che visualizza la casella, per mantenere l'oggetto nullo inconsapevole dei dettagli dell'interfaccia utente). – kyoryu

+0

@John Saunders: (a proposito, potrebbe non esserci un'opzione valida per evitare il controllo nullo - ma proverei certamente a vedere se ce n'era una). – kyoryu

0

Penso che il tuo codice sia buono: prima hai controllato il caso normale (lastSelection != null) per il caso anomalo.

posso solo aggiungere una singola modifica:

if (lastSelection != null) 
{ 
    lastSelection.changeColor(); 
    //your other normal code 
} 
else 
{ 
    MessageBox.Show("No Selection Made"); 
    //return; //no need for this now 
} 
+1

@Sameh: il tuo suggerimento funziona se questo è tutto il codice che c'è nel metodo. Ma come faresti se ci fossero 10 copie dello stesso codice, forse con ciascuna che controlla una diversa variabile per null? –

+0

@ John: questo è un buon punto, ma il suo problema sembra abbastanza semplice da dire quello che ho detto. –

+0

@Sameh: mi sembrava che non ci avesse mostrato tutto il suo codice e che il codice che mostrava non era l'unico codice nel metodo. Potrei sbagliarmi. –

1

Vedendo tutti gli altri ha le buone risposte, non farlo:

if (lastSelection == null) goto ERR; 
lastSelection.changeColor(); 
//... possibly more stuff... 
return; 
ERR: 
MessageBox.Show("No Selection Made"); 
+1

Heh. Questo è un buon consiglio. Per essere chiari, quando ho detto che non mi piacciono le dichiarazioni di ritorno multiple, non intendevo difendere il Gotos in alcun modo! – overslacked

0

Una pratica recuperando veloce è quello di scrivere Nulla come prima:


if (null == lastSelection) 
{ 
    MessageBox.Show("No Selection Made"); 
    return; 
} 

lastSelection.changeColor(); 
 
+5

@pokrate: "recupero veloce"? Man, quello è un artefatto dai tempi di C, quando il compilatore non ti avvisava di fare 'if (lastSelection = null)'. Ha quasi due decenni! –

+0

@pokrate, nel caso in cui non lo sapessi, riceverai effettivamente * un errore del compilatore * se proverai ad assegnare una singola variabile in un if in C#. Sono così triste che questi tipi di costrutti saranno quasi del tutto persi ... – overslacked

+0

Questa è una nuova pratica, ho visto in quasi tutti i kit di avviamento di asp.net e qui in StackOverflow. E sto usando VS2008 e non riesco a vedere alcun avvertimento del compilatore. – pokrate

1

Questo è ancora un altro modo di implementarlo.

 Action _action = (lastSelection != null 
           ? 
            new Action(lastSelection.changeColor) 
           : 
           () => Console.WriteLine("No Selection Made")); 
     _action.Invoke(); 

Forse un po 'eccessivo, ma si avrà certamente la gente mantenere il vostro codice a grattarsi la testa :-)

+0

Leggere questo codice mi ha fatto venire il prurito, ma il prurito non era nella mia testa :) – BillW

+1

Questo codice è molto intelligente. Aspetta, c'è qualcosa che non va ... Ero * certo * che intelligente era una parola di quattro lettere ... – kyoryu