2009-09-10 12 views
5

Se ho il codice come questo:Dichiarare variabili il più tardi possibile e passando metodo che restituisce come parametro

string s = MyClass.GetString(); // Returns string containing "hello world"; 
ProcessString(s); 

E` più lentamente di quanto?

ProcessString(MyClass.GetString()); 

Se sì, perché? Nel secondo esempio, il compilatore generalmente genera una variabile da GetString(); metodo che restituisce una stringa?

Inoltre, qual è il vantaggio di dichiarare le variabili il più tardi possibile? Questo avvantaggia il GC? Se è così, come (sto assumendo in termini di GC Gens)?

Grazie

risposta

10

No, il compilatore emetterà IL identica per entrambi questi esempi (non tutti esempi come questo, si badi bene, solo questo esempio specifico).

Ricorda che tutte le variabili locali in C# vengono tutte raccolte insieme nell'IL nella parte superiore del metodo, quindi non importa quando le dichiari poiché il CLR assegnerà spazio per loro all'immissione del metodo.

Il vantaggio di dichiarare le variabili il più tardi possibile è esclusivamente per migliorare la leggibilità del codice. Dichiarare le variabili il più vicino possibile al luogo in cui vengono utilizzate consente ai lettori del tuo codice di raccogliere informazioni contestuali su cosa sia e cosa fa la variabile oltre il nome della variabile.

+0

Grazie. Quindi, per i due esempi di codice, sono praticamente gli stessi sotto il cofano. Comprendo perfettamente la tua risposta alla mia seconda domanda. :) – dotnetdev

+0

Se dichiarate le variabili nella parte superiore del blocco, quindi assegnatele in seguito, chiamate inutilmente il costruttore predefinito. Probabilmente non è un grosso problema nella maggior parte dei casi. –

+0

George V. Reilly ha detto "Se dichiari le variabili nella parte superiore del blocco, quindi assegnale a loro in un secondo momento, stai chiamando inutilmente il loro costruttore predefinito", ma questo è vero solo in C++. La domanda è stata contrassegnata come C# e nessun costruttore viene chiamato in questo caso. Il riferimento ha semplicemente il valore null. – alexk7

Problemi correlati