2012-08-16 13 views
8

Eventuali duplicati:
Is it better to declare a variable inside or outside a loop?Questa "dichiarazione di traslazione più vicina all'utilizzo" è davvero preferibile?

ReSharper vuole che io di cambiare questo:

int Platypus; 
string duckBill1; 
string duckBill2; 
string duckBill3; 
. . . 
using (OracleDataReader odr = ocmd.ExecuteReader()) { 
    while (odr.Read()) { 
     Platypus = odr.GetInt32("Platypus"); 
     duckBill1 = odr.GetString("duckBill1"); 
     duckBill2 = odr.GetString("duckBill2"); 
     duckBill3 = odr.GetString("duckBill3"); 
     switch (Platypus) { 
     . . . 

... a questo:

using (OracleDataReader odr = ocmd.ExecuteReader()) { 
    while (odr.Read()) { 
     int Platypus = odr.GetInt32("Platypus"); 
     string duckBill1 = odr.GetString("duckBill1"); 
     string duckBill2 = odr.GetString("duckBill2"); 
     string duckBill3 = odr.GetString("duckBill3"); 
     switch (Platypus) { 
     . . . 

... ma in questo modo (sembra, almeno, quello) i vars vengono dichiarati N volte, una volta per volta attraverso il ciclo while. Il modo ridisegnato è davvero migliore dell'originale?

risposta

16

Sì, è meglio perché si limita l'ambito delle variabili dichiarate. Non ci saranno impatti sulle prestazioni per dichiararli all'interno del ciclo. La ragione per cui Resharper suggerisce questo cambiamento è che non li stai utilizzando al di fuori del ciclo.

+5

E se li si dichiara fuori dal ciclo, il loro ambito sarà più ampio, il che significa che ci vorrà più tempo per essere rilasciati. +1 –

+1

@AndreCalil No, non lo farà, perché l'ambito non ha nulla a che fare con l'ammissibilità della raccolta. L'impatto sulle prestazioni è nullo, come dice rsbarro. –

+0

@JonHanna Mi dispiace, non vedo dove le collezioni sono nell'argomento. Se dichiari una variabile nell'ambito di un metodo, non verrà rilasciato fino alla fine del metodo. Se l'ambito è solo un ciclo (come quello 'while'), verrà rilasciato prima. E anche una stringa nulla alloca la memoria: http://stackoverflow.com/a/6601485/1484750 –

2

Il compilatore generalmente ottimizza tali espressioni e "solleva" la dichiarazione di variabile all'esterno del ciclo, poiché la variabile stessa non dipende dalle condizioni del ciclo. Questo produce in modo efficace il codice che hai dimostrato nel primo esempio.

In questo caso, il suggerimento di Resharper è solo per rimuovere alcune linee di codice ridondanti, oltre a ridurre il loro ambito precompilato.

+0

Non c'è niente da sollevare, la dichiarazione dice semplicemente "quando questo nome è usato all'interno di questo scope, significa ...", che non si traduce nel codice compilato. Tuttavia, se fosse assegnato con la dichiarazione, e quell'assegnazione non fosse stata sovrascritta in un secondo momento nel ciclo (il che cambierebbe comunque il significato), allora molto probabilmente verrebbe annullata. –

4

Sì, ma dichiararli non richiede tempo in fase di esecuzione. Non occupano più memoria perché il compilatore riutilizzerà solo le loro posizioni di memoria.

8

In generale, è buona prassi di programmazione dichiarare le variabili nel modo più ristretto possibile. Le ragioni sono:

  1. Informazioni nascoste.
  2. Più facile da capire.
  3. Meno probabilità di bollare qualcosa.

Anche se sembra che le variabili siano state appena dichiarate con ogni iterazione sul ciclo, vengono dichiarate in fase di compilazione, non in fase di esecuzione. Lo spazio viene allocato sullo stack frame per la variabile [s] e lo stesso spazio viene riutilizzato per ogni iterazione sul loop.

Problemi correlati