Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Buongiorno a tutti, mentre programmavo ho scritto questo:
Codice sorgente - presumibilmente VB.NET
ForEach rect as rectangle in rectangles
rect =new rectangle(rect.x, rect.y-5, 300, 25)
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ì:
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.
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
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à.