2013-04-23 17 views
5

Se ho il seguente gruppo di funzioni staticheche è meglio in questo caso, il ritorno o ref

qui ho inviato la variabile per riferimento:

public static void ProcessEmailMessage(ref string HTML) 
     { 
      ModifyLinks(ref HTML); 
      AddFakeImage(ref HTML); 
     } 

     public static void ModifyLinks(ref string HTML) 
     { 
      //modify HTML links 
     } 


     public static void AddFakeImage(ref string HTML) 
     { 
      //adds an image to the HTML 
     } 

e qui ho inviato la variabile valore

public static string ProcessEmailMessage(string HTML) 
     { 
      HTML = ModifyLinks(HTML); 
      HTML = AddFakeImage(HTML); 
      return HTML; 
     } 

     public static string ModifyLinks(string HTML) 
     { 
      //modify HTML links 
      return HTML; 
     } 


     public static string AddFakeImage(string HTML) 
     { 
      //adds an image to the HTML 
      return HTML; 
     } 

quale ha più senso, e c'è qualche differenza di prestazioni tra il 2?

+2

** b) ** ......... – I4V

risposta

8

Evitare di utilizzare i parametri di uscita e di rif., Se possibile.

I metodi che utilizzano i parametri ref e out sono più difficili da utilizzare, è necessario dichiarare una variabile per contenere il risultato e la semantica è un po 'più difficile da comprendere. La differenza di prestazioni (se presente) sarebbe trascurabile.

L'analisi del codice in Visual Studio probabilmente emetterà un avviso per il loro utilizzo in questo caso.

Vedere http://msdn.microsoft.com/en-us/library/ms182131 per una descrizione più dettagliata.

+1

Un collegamento a un documento esterno è buono, ma è necessario includere un riepilogo qui. Le risposte SO dovrebbero comunque essere utili se il collegamento esterno si interrompe. – cdhowie

+0

@cdhowie: Grazie per avermelo fatto notare. Ho modificato il post per includere un po 'più di un sommario. – DeCaf

2

È probabile che si verifichi un maggiore impatto in termini di prestazioni quando si utilizza ref, poiché ciò equivale a un livello aggiuntivo di riferimento indiretto durante l'assegnazione alla variabile. Tuttavia, questa differenza è probabilmente trascurabile.

preferirei le forme che restituiscono una stringa, in quanto questo è più illustrativo di ciò che è realmente accadendo, e si permette di metodo catena di chiamate insieme, se si preferisce:

return AddFakeImage(ModifyLinks(HTML)); 

Con il modulo ref si forzare il codice di chiamata per dichiarare una variabile e non potrebbero altrimenti. Ciò ostacola la leggibilità e aumenta l'incidenza del codice boilerplate privo di significato.

+0

Tecnicamente una variabile viene dichiarata in entrambi i casi, è solo una questione di sapere se il programmatore debba o meno averne bisogno. Nell'esempio di codice che hai dato c'è una variabile locale implicita senza nome che esiste. Ora, detto questo, è bello non doverlo sapere, ma dal punto di vista delle prestazioni, non è affatto diverso. – Servy

+0

@Servy Ci sarà un registro quando JIT-compilato, ma l'esempio di codice che ho mostrato dichiarerà uno meno locale del codice originale. L'IL abbreviato sarebbe 'ldarg.0; chiamata; chiamata; ret; '. Quindi no, non esiste una "variabile aggiuntiva", almeno non fino alla traduzione in codice nativo. (E le variabili in realtà non esistono nel codice nativo, solo registri e posizioni di memoria.Il concetto di una variabile è di livello superiore rispetto al codice nativo.) – cdhowie

+0

In entrambi i casi, se esiste un nome locale o meno, quando si arriva a l'effettivo livello di istruzione del processore, entrambi sono probabilmente registrati in modo en-registrato, ma entrambi potrebbero potenzialmente essere archiviati in qualche posizione nella memoria, se ciò non è possibile. – Servy

1

Le differenze di prestazioni tra i due sono trascurabili. È praticamente una questione di preferenza per la sintassi.

Le convenzioni standard comportano il ritorno di una nuova stringa piuttosto che la modifica di un parametro passato per riferimento. Ci sono alcune occasioni in cui è più facile da usare (vale a dire quando non si ha una variabile denominata, ad esempio quando si desidera passare il valore di ritorno di un metodo o di una proprietà anziché di un campo).

1

Non c'è molta differenza, ma mi piacerebbe andare con "ritorno". Prova a evitare "ref" se possibile.

La ragione è che non avrebbe dovuto dichiarare una variabile prima di passare il risultato di un'altra chiamata e si può chiamate a catena:

con rif:

string modifyMe = GetMeString(); 
ModifyLints(ref modifyMe); 
AddFakeImage(ref modifyMe); 

rispetto per tornare:

string result = AddFakeImage(ModifyLinks(GetMeString())); 
1

Se è necessario restituire più oggetti, utilizzare ref/out, se è possibile farlo con return semplicemente restituendo un oggetto ect, utilizzare return.
ref rende il tuo codice inutilmente oscuro e produce overhead di scrittura che in questo caso non è necessario.
Si dovrebbe sempre cercare di mantenere il proprio codice semplice e comprensibile.

1

preferisco qualcosa di simile a un costruttore che fa:.

nuove EmailMessageProcessor (html) .WithModifiedLinks() WithFakeImages().

Quindi niente argomenti di riferimento e tutto è incapsulato.

Problemi correlati