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.
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.
È possibile ridurre l'ingombro invertendo la condizione:.
if (lastSelection == null)
{
MessageBox.Show("No Selection Made");
return;
}
lastSelection.changeColor();
Ha! Beh, +1 ovviamente :) – overslacked
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
:-) Due menti che entrano nella stessa soluzione allo stesso tempo. Il tuo ha più commenti però. – Bevan
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.
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. –
@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
@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
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
}
@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? –
@ John: questo è un buon punto, ma il suo problema sembra abbastanza semplice da dire quello che ho detto. –
@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. –
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");
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
Una pratica recuperando veloce è quello di scrivere Nulla come prima:
if (null == lastSelection)
{
MessageBox.Show("No Selection Made");
return;
}
lastSelection.changeColor();
@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! –
@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
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
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 :-)
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