Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - [VB.NET] Comportamento di una variabile temporanea
Forum - C# / VB.NET - [VB.NET] Comportamento di una variabile temporanea

Avatar
Dedalux (Member)
Pro


Messaggi: 103
Iscritto: 15/12/2010

Segnala al moderatore
Postato alle 20:28
Martedì, 23/08/2011
Ciao a tutti,
vorrei capire perchè avviene questa cosa:

mi sono accorto che quando ho due o più cicli iterativi nidificati, se dichiaro una variabile temporanea tra un ciclo e l'altro, per ottenere l'effetto che desidero devo rispettare uno di questi schemi.

Codice sorgente - presumibilmente C# / VB.NET

  1. Inizio Ciclo
  2.          Dim n As Int32
  3.          Inizio Altro Ciclo
  4.                   'Modifiche al valore di n
  5.          Fine Altro Ciclo
  6.          n = 0
  7. Fine Ciclo



Codice sorgente - presumibilmente C# / VB.NET

  1. Inizio Ciclo
  2.          Dim n As Int32 = 0
  3.          Inizio Altro Ciclo
  4.                   'Modifiche al valore di n
  5.          Fine Altro Ciclo
  6. Fine Ciclo



se nel primo scenario non imposto n = 0, o se non utilizzo il secondo scenario, il valore di n non torna a 0
questo ovviamente significa che la variabile è temporanea rispetto al metodo e non al ciclo.
Ma non dovrebbe essere temporanea anche rispetto al ciclo?

Sinceramente la cosa mi da un po fastidio, LOL

Perchè se dichiaro Dim n As Int32 senza = 0 non ritorna a 0? Perchè non viene ricreata sovrascrivendo il valore precedente?

Sembra ovvio ma vorrei averne la certezza assoluta.

Grazie ragazzi.

Ultima modifica effettuata da Dedalux il 23/08/2011 alle 20:32


«La disumanità del computer sta nel fatto che, una volta programmato e messo in funzione, si comporta in maniera perfettamente onesta.»

Isaac Asimov
PM Quote
Avatar
lorenzo (Normal User)
Guru


Messaggi: 1178
Iscritto: 15/04/2008

Segnala al moderatore
Postato alle 21:50
Martedì, 23/08/2011
Sinceramente penso che sia una questione di riutilizzo della memoria...comunque sappi che dichiarare una variabile all'interno di un ciclo è una pessima pratica di programmazione.

La dichiarazione la metti fuori dai due cicli mentre l'inizializzazione all'interno.

Codice sorgente - presumibilmente C# / VB.NET

  1. Dim n As Int32
  2. Inizio Ciclo                  
  3.     n = 0
  4.     Inizio Altro Ciclo                  
  5.         'Modifiche al valore di n          
  6.     Fine Altro Ciclo          
  7. Fine Ciclo



questo perché la memoria viene allocata una sola volta, per poi essere riutilizzata all'interno dei cicli. Con il tuo metodo invece forzi la reallocazione della memoria, perdendo anche tempo.


"There's no point in being exact about something if you don't even know what you're talking about."

JOHN VON NEUMANN


Siamo italiani NO??
Allora scriviamo in ITALIANO!!!!
PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 22:20
Martedì, 23/08/2011
@Dedalux, no le variabili sono sempre temporanee rispetto al blocco di codice dove vengono dichiarate, il perché sia necessaria un'inizializzazione esplicita dipende da come il CLR è stato strutturato.

@lorenzo in realtà in .NET è uguale, il compilatore è abbastanza intelligente da rendersene conto (questo sinché non si inizia a parlare di variabili captured in anonymous methods e lambda expressions, ma è un'altro discorso e non c'entra con le prestazioni)

Infatti, questi due snippet
Codice sorgente - presumibilmente VB.NET

  1. Do
  2. Dim i As Int32
  3. Loop


Codice sorgente - presumibilmente VB.NET

  1. Dim i As Int32
  2. Do
  3. Loop


Vengono tradotte nello stesso MSIL
Codice sorgente - presumibilmente Plain Text

  1. // Code size       6 (0x6)
  2.   .maxstack  0
  3.   .locals init ([0] int32 i)
  4.   IL_0000:  nop
  5.   IL_0001:  nop
  6.   IL_0002:  br.s       IL_0002
  7.   IL_0004:  nop
  8.   IL_0005:  ret


Ultima modifica effettuata da il 28/08/2011 alle 18:48
PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 17:34
Domenica, 28/08/2011
Entrambi i tuoi esempi sono equivalenti. La variabile viene comunque dichiarata nello stesso blocco e perciò ha lo stesso scope. L'esistenza e l'inizializzazione di una variabile dipendono, nel caso di tipi valore, dalla posizione della sua dichiarazione rispetto ai blocchi di codice. Infatti, nel caso di tipi valore, esiste sempre un valore di default attribuito alla variabile dal CLR (in questo caso 0).
Vedi qui, l'ultimo paragrafo:
http://totemslair.org/guide/viewchapter.php?guida=vb&id=7


"Infelici sono quelli che hanno tanto cervello da vedere la loro stupidità."
(Fligende Blatter)

"Dubitare di se stessi è il primo segno d'intelligenza."
(Ugo Ojetti)
PM Quote
Avatar
Dedalux (Member)
Pro


Messaggi: 103
Iscritto: 15/12/2010

Segnala al moderatore
Postato alle 3:07
Martedì, 30/08/2011
Si lo so che i due esempi sono uguali. Quello che volevo sapere infatti era la logica di fondo per cui il valore della variabile non torna a 0 ad ogni ripassaggio nel ciclo, se non la dichiaro uguale a 0 o non la imposto a 0 alla fine.

L'ho capito grazie alla risposta di VMikle, che mi ha illuminato mostrandomi la traduzione in MSIL:

nel primo caso è evidente: la reimpostazione a 0 è esplicita alla fine del primo ciclo
nel secondo caso invece il codice viene tradotto come:

Codice sorgente - presumibilmente C# / VB.NET

  1. Dim n As Int32
  2. Inizio Ciclo
  3.          n = 0
  4.          Inizio AltroCiclo
  5.          Fine AltroCiclo
  6. Fine Ciclo



mentre se dichiarassi la variabile senza scrive = 0 non ci sarebbe quell' "n = 0" all'inizio del primo ciclo

o ho capito male?

Ultima modifica effettuata da Dedalux il 30/08/2011 alle 3:10


«La disumanità del computer sta nel fatto che, una volta programmato e messo in funzione, si comporta in maniera perfettamente onesta.»

Isaac Asimov
PM Quote