Problema assegnazione variabili in vb.net

mercoledì 18 giugno 2008 - 11.34

Lucifel Profilo | Junior Member

Ciao a tutti,
ho notato un comportamento strano nell'assegnazione di variabili in VB .NET, cosa che non capiterebbe in altri linguaggi.
In pratica ho una classe che ho creato che chiamiamo A e una classe che chiamiamo B che contiene A. Faccio:

Dim a as A = B.A

A questo punto voglio modificare a facendo delle somme:

for i as integer = 0 to n
a.a += 1
a.b += 1
a.c += 1
next

Lasciando perdere il significato di sto codice, io mi aspetto che le variabili che ho in B.A restino immutate, in realtà non è così. Infatti alla fine del ciclo
for se guardo B.A.a ha esattamente il valore modificato finale ottenuto alla fine del ciclo.

Sinceremente la vedo come una cosa strana, che in C# non capita. Ho pensato di clonare la classe B.A prima di assegnarla, ma dato che è una classe che
ho creato io non esiste il metodo clone, quindi come faccio a farlo?

Grazie a chiunque risponda.

Diego
-----------------------------------
Avanti sempre e comunque!
-----------------------------------

aiedail92 Profilo | Expert

Ciao

Questo avviene perchè le classi sono un tipo riferimento, e quando ad una variabile che ha per tipo una classe assegni un valore, quello che assegni in realtà è l'indirizzo in memoria del valore, pertanto ogni modifica che apporti alla variabile, si ripercuote sull'oggetto assegnato. (e in C# è unguale )

Quello che puoi fare è, nella classe A implementare l'interfaccia ICloneable per ottenere una copia della classe, oppure istanziare a ad un nuovo oggetto A e copiare al suo interno i valori B.A.a, B.A.b, B.A.c ecc... (che è la stessa cosa, ma devi riscrivere tutto ogni volta)

Class A Implements ICloneable Public a, b, c As Integer Function Clone() As Object Implements ICloneable.Clone Dim result As New A result.a = a result.b = b result.c = c Return result End Function End Class Sub TuaSub() Dim a As A = B.A.Clone() For i As Integer = 0 To n a.a += 1 a.b += 1 a.c += 1 Next End Sub

-oppure-

Sub TuaSub() Dim a As New A a.a = B.A.a a.b = B.A.b a.c = B.A.c For i As Integer = 0 To 10 a.a += 1 a.b += 1 a.c += 1 Next End Sub

Luca

Lucifel Profilo | Junior Member

Ti ringrazio... hai risolto un dubbio che mi ha fatto discutere con il mio collega tutta stamattina (e che lui diceva che non era possibile).

Il problema è che non posso usare il metodo dell'IClonable perché il New della mia classe accetta un parametro e quindi dovrei passarglielo dentro la CLONE.

Ora guardo come risolvere il problema. Intanto grazie infinite.
Diego
-----------------------------------
Avanti sempre e comunque!
-----------------------------------

aiedail92 Profilo | Expert

Ti suggerisco due possibili soluzioni:

1) Aggiungi un costruttore privato che non accetta parametri, in modo da poter inizializzare A soltanto all'interno della classe stessa, ed essere in grado di inizializzare dal metodo Clone

2) Se il parametro del costruttore viene salvato all'interno della classe, o comunque lo puoi ricavare dalla classe, passi quello dell'oggetto da clonare al costruttore (p.e. se il costruttore serve per determinare A.a, passi al costruttore Me.a)

Luca
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5