2012-05-14 13 views
5

Il mio metodo ritorna in molti punti. Costruisco newData durante l'esecuzione anche in molti punti. Indipendentemente da dove torno, devo salvare e memorizzare il risultato costruito. Da non perdere "return" Ho appena circondato il codice con il blocco try-finally, quindi ora sono sicuro che i nuovi dati verranno archiviati.è consigliabile utilizzare try-finally solo per assicurarsi che qualcosa venga eseguito al termine del metodo?

List<X> newData = new List<X>(); 
try 
{ 
    .... 
    update newData 
    ..... 
    return; 
    ..... 
    .... 
    update newData 
    .... 
    update newData 
    return; 
    ..... 
    return; 
} finally 
{ 
    // copy newData to data  
} 

Ma non rilevo eccezioni e questo codice non è destinato a funzionare con eccezioni. È accettabile in generale o puoi suggerire un altro approccio migliore?

+0

Sembra che si possa usare una [istruzione switch] (http://msdn.microsoft.com/en-us/library/06tc147t%28v=vs.100%29.aspx). Non vedo perché è necessario tornare immediatamente. –

+0

È accettabile solo se funziona come previsto. Se non funziona, prova a rifarlo in funzioni più piccole. Se lo fa, qual è il problema? Non posso dare alcun suggerimento specifico senza vedere il codice sorgente più dettagliato. – Flaise

+0

A meno che qualcuno non tocchi la presa, il blocco 'finally' viene eseguito in ogni caso e il codice funzionerà come previsto; tuttavia, come già sottolineato da altri, esistono modi migliori per strutturare il codice. –

risposta

6

Vorrei suggerire il refactoring del codice all'interno del blocco try in un nuovo metodo:

data = CreateList(); 

... 

private List<X> CreateList() 
{ 
    List<X> list = new List<X>(); 
    // It's fine to return list from any point here... 
} 
+0

Questo è quasi quello che stavo per suggerire: aggiungerei che in alcuni casi, quando per la leggibilità è meglio mettere il corpo di 'CreateList' nell'altro metodo, si può usare un delegato' Action' da cui un 'return' esce solo quel metodo anonimo. – hvd

+0

grazie, è quello che mi serve – javapowered

2

L'utilizzo di finalmente è intesa come una copia di backup se qualcosa non riesce (pensare ad esso come un meccanismo di fail-safe),

Generalmente l'intera costruzione del tuo metodo è sbagliata e puoi refactoring, dato che ottenere tutti questi ritorni di solito significa che puoi adottare un altro approccio alle cose (ad esempio usando un interruttore come qualcuno nei commenti suggeriti) .

+0

'switch' non è quello che mi serve. il codice all'interno ha molte ramificazioni e difficile da refactare in quanto la logica non è banale – javapowered

Problemi correlati