Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - Problema costrutto For Each
Forum - C# / VB.NET - Problema costrutto For Each

Avatar
Ale96 (Member)
Pro


Messaggi: 132
Iscritto: 06/04/2010

Segnala al moderatore
Postato alle 20:43
Domenica, 26/09/2010
Buongiorno a tutti, mentre programmavo ho scritto questo:
Codice sorgente - presumibilmente VB.NET

  1. For Each rect as rectangle in rectangles
  2.     rect = new rectangle(rect.x, rect.y -5, 300, 25)
  3. Next


(Rectangles è una lista di rettangoli)
Il compilatore non ha segnato nessun errore
visto che i rettangoli venivano poi disegnati sullo schermo mi sono accorto che non venivano ne spostati ne ridimensionati, in un certo senso ho risolto così:
Codice sorgente - presumibilmente VB.NET

  1. For index as integer = 0 to rectangles.count -1
  2.     rectangle(index) = new rectangle(rect.x, rect.y -5, 300, 25)
  3. Next


Questo funziona ma è meno elegante, e mi chiedevo se fosse possibile, usando For Each, cambiare le proprietà di un oggetto. O devo usare il secondo metodo?
Grazie a chiunque mi aiuti o almeno ci provi.

PM
Avatar
TEX WILLER (Normal User)
Expert


Messaggi: 579
Iscritto: 07/07/2009

Up
2
Down
V
Segnala al moderatore
Postato alle 22:18
Domenica, 26/09/2010
Credo che con il for each non vada, quindi questo, poi non sò!

PM
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Up
5
Down
V
Segnala al moderatore
Postato alle 18:00
Lunedì, 27/09/2010
E' come ha detto tex, solo che lui non ha la minima idea del perchè XD
Te lo dico io: durante l'enumerazione con il for each, viene invocata la proprietà Current dell'interfaccia IEnumerable, nella quale il codice potrebbe essere qualcosa di questo tipo:
Codice sorgente - presumibilmente C# / VB.NET

  1. Return elem(index)


Come sappiamo, però, Rectangle è una struttura, quindi non viene restituito l'indirizzo a cui si trova nella memoria ma direttamente il suo valore, perchè è un tipo value. Quindi la variabile temporanea rect contiene solo una copia del valore di rectangles(i) (per qualche i), con il risultato che assegnadogli un nuovo oggetto sovrascrivi una variabile temporanea che viene persa alla fine del ciclo.

Funziona, invece, con le variabili reference, ma solo se ne cambi le proprietà.

PM
Avatar
Ultimo (Member)
Guru


Messaggi: 877
Iscritto: 22/05/2010

Up
0
Down
V
Segnala al moderatore
Postato alle 12:22
Martedì, 28/09/2010

Quoto il grande Totem :k:


If ok Then GOTO Avanza else GOTO Inizia

PM