2010-09-16 5 views
5

ho qualcosa di simile a questo:È possibile interrompere/restituire l'esecuzione del metodo da un altro metodo?

void MethodToBreak() 
{ 
    // do something 

    if(something) 
    { 
     MethodThatBreaks(); 
     return; 
    } 

    // do something 
} 

void MethodThatBreaks() 
{ 
    // do something 
} 

Così, mi chiedevo: è possibile interrompere l'esecuzione da: MethodThatBreaks()? Quindi, vorrei: if(something) MethodThatBreaks(); e se la condizione all'interno di if è vera, niente dopo quella riga verrà eseguita.

NOTA: so che è possibile con else in questo caso, ma non lo voglio.

+0

Vuoi dire * invece * del 'return' hai attualmente? –

+1

Sì, è esattamente ciò che intendo :) – avance70

+0

No non proprio allora, voglio dire che potresti lanciare un'eccezione, o se avevano dei tipi di ritorno quindi "restituisci MethodThatBreaks()" su una riga, ma nessuna di queste è la soluzione appropriata, che cosa hai la migliore rotta IMO. –

risposta

4

Sarebbe un incubo mantenere se si dovesse sconvolgere l'esecuzione di un metodo da un altro. Cercando di capire perché il tuo flusso di controllo è dappertutto, sei mesi dopo la linea, o per un altro sviluppatore, sarebbe un aneurisma.

Non c'è niente di sbagliato in quello che stai già facendo lì, anche se personalmente userei un else. C'è una ragione particolare per cui non vuoi usare else? Se il codice rimanente è troppo lungo forse è e l'indicazione che si dovrebbe refactoring.

+2

Il cortocircuito è un approccio normale, questo è ciò che sta facendo attualmente ... fare il lavoro e uscire il prima possibile. Non è la tazza di tè di tutti, ma è un approccio/stile perfettamente valido :) –

+0

Non voglio altro perché potrei avere un caso come questo: 'while (qualcosa) if (qualcos'altro) MethodThatBreaks()' – avance70

+1

Allora Non vedo alcun problema con quello che hai già, è chiaro che se succede "qualcos'altro", allora vuoi eseguire un metodo e poi smettere di fare qualsiasi altra cosa. Come dice Nick, è perfettamente normale. –

0

Lanciare un'eccezione in MethodThatBreaks è una possibilità. Quindi nel client dello MethodToBreak hai messo il blocco catch try.

+3

Che va bene per errori, ma sembra che debba essere restituito indipendentemente dal risultato di MethodThatBreaks. L'utilizzo di un'eccezione per il controllo del flusso in quella causa non è severamente consigliato ... –

+0

@Dave "L'utilizzo di un'eccezione per il controllo del flusso in quella causa non è consigliabile". Assolutamente! Ma la domanda era di fare qualcosa che non fosse una singola linea, nemmeno un ritorno. Almeno questa è la mia comprensione della domanda. – Aliostad

+0

Sì, grazie, ma non posso usare le eccezioni.Non volevo complicare la domanda spiegando l'architettura corrente: questa è un'applicazione client/servizio WCF. Uso le eccezioni sul servizio se si esegue qualcosa di illegale, ad esempio lanciare un'eccezione se qualcuno accede con una combinazione utente/password errata. In questo caso 'MethodThatBreaks()' è usato per comunicare un avviso che non dovrebbe terminare la sessione corrente, ma interromperà l'esecuzione del metodo. – avance70

-2

questo può essere fatto da: dichiarare variabile globale

a=null; 
void MethodToBreak() 
{ 
    // do something 

    if(something) 
    { 
     MethodThatBreaks(); 
     if(a==null){ 

     } else{ 
     return; 
     } 
    } 

    // do something 
} 

void MethodThatBreaks() 
{ 
    a="somevalue"; 
    // do something 
}