Duplicare un oggetto

venerdì 01 giugno 2007 - 23.04

erongis Profilo | Junior Member

Ho un problema: Come faccio a duplicare un oggetto? se faccio obj01 = obj02, in realtà ottengo che l'obj01 punti all'obj02. Invece io ne voglio una copia identica ma residente in un altro indirizzo di memoria, cosi se dispongo uno dei due, l'altro rimane intatto.

Grazie

0v3rCl0ck Profilo | Guru

Ciao,

implementa una funzione pubblica chiamata .Copy() che restituisce la copia dell'oggetto.

Eccoti un esempio:

Public Class TestObject Private _Prop1 As Integer Private _Prop2 As String Public Property Prop1() As Integer Get Return _Prop1 End Get Set (value As Integer) _Prop1 = value End Set End Property Public Property Prop2() As Integer Get Return _Prop2 End Get Set (value As Integer) _Prop2 = value End Set End Property Public Function Copy() As TestObject Dim NewTestObject As New TestObject NewTestObject.Prop1 = Me.Prop1 NewTestObject.Prop2 = Me.Prop2 Return NewTestObject End Function End Class


Spero di esserti stato utile
Enjoy It
http://blogs.dotnethell.it/Regulator/

erongis Profilo | Junior Member

Devo copiarmi tutte le proprietà? Non c'è un modo per copiare il tutto con un'istruzione sola?

0v3rCl0ck Profilo | Guru

Si, devi copiarti tutte le proprietà o comunque almeno quelle fondamentali per mantenere l'oggetto valido.

http://blogs.dotnethell.it/Regulator/

munissor Profilo | Senior Member

Per consistenza con il resto delle classi del frameworkil metodo dovrebbe chiamarsi Clone() e dovresti implementare ICloneable.

Se vuoi che il framework faccia una copia di tutti i campi al posto tuo puoi usare object.MemberwiseClone(). In questo modo hai una copia dell'oggetto che inizia il grafo, tutti gli altri oggetti però sono gli stessi.

Il metodo migliore da usare dipende da com'è fatta la classe e da cosa devi fare...

Wamba Profilo | Expert

0v3rCl0ck, scusa se mi intrometto.
Una soluzione non potrebbe essere questa:

class Program
{
static void Main(string[] args)
{
Person Mario = new Person("Mario", "Rossi");
Person Giulio = Mario.Clone();
Giulio.Name = "Giulio";

Console.WriteLine("Mario:" + Mario.Name + " " + Mario.Surname);
Console.WriteLine("Giulio:" + Giulio.Name + " " + Giulio.Surname);

Console.ReadLine();
}
}

public class Person
{
public string Name;
public string Surname;

public Person()
{ }

public Person(string Name, string Surname)
{
this.Name = Name;
this.Surname = Surname;
}

public Person Clone()
{
return (Person)this.MemberwiseClone();
}

}


Questo è valido se la classe che vuoi clonare non ha come proprietà/attributi altre classi che devono essere clonate a loro volta.

Per maggiori informazioni ti rimando a MSDN:
http://msdn2.microsoft.com/it-it/library/system.object.memberwiseclone(VS.80).aspx

-----------------------------------------------------------
Solo chi ha il Caos dentro può generare una stella danzante
Wamba

0v3rCl0ck Profilo | Guru

Si grazie per la precisazione, mi sarà utile anche a me in futuro, io ho sempre fatto le cose a manina, ma se ci sono metodi che fanno lo sbatti per noi, meglio ancora...pigrizia ownzzz

>0v3rCl0ck, scusa se mi intrometto.
>Una soluzione non potrebbe essere questa:
>
> class Program
> {
> static void Main(string[] args)
> {
> Person Mario = new Person("Mario", "Rossi");
> Person Giulio = Mario.Clone();
> Giulio.Name = "Giulio";
>
>Console.WriteLine("Mario:" + Mario.Name + " " + Mario.Surname);
>Console.WriteLine("Giulio:" + Giulio.Name + " " + Giulio.Surname);
>
> Console.ReadLine();
> }
> }
>
> public class Person
> {
> public string Name;
> public string Surname;
>
> public Person()
> { }
>
> public Person(string Name, string Surname)
> {
> this.Name = Name;
> this.Surname = Surname;
> }
>
> public Person Clone()
> {
> return (Person)this.MemberwiseClone();
> }
>
> }
>
>
>Questo è valido se la classe che vuoi clonare non ha come proprietà/attributi
>altre classi che devono essere clonate a loro volta.
>
>Per maggiori informazioni ti rimando a MSDN:
>http://msdn2.microsoft.com/it-it/library/system.object.memberwiseclone(VS.80).aspx
>
>-----------------------------------------------------------
>Solo chi ha il Caos dentro può generare una stella danzante
>Wamba

http://blogs.dotnethell.it/Regulator/

lup0z Profilo | Newbie

Devi fare un overloading dell'operatore di uguaglianza (sempre se in C# si può -.-) in modo da fare copie profonde; cioè se hai un puntatore, invece di copiare l'indirizzo, copi la locazione di memoria a cui punta.

0v3rCl0ck Profilo | Guru

L'overloading dell'operatore di copia è fuori standard in .NET è consigliabile implementare una interfaccia come l'IClonable oppure crearsi una funzione Copy come quella utilizzata dal DataTable, io di solito preferisco usare una funzione Copy per fare il DeepCopy (copia profonda) dell'oggetto, mentre implemento l'interfacca IClonable implementando la funzione Clone, che però utilizzo per fare lo ShallowCopy e quindi copiare solo gli oggetti ad alto-livello.

>Devi fare un overloading dell'operatore di uguaglianza (sempre
>se in C# si può -.-) in modo da fare copie profonde; cioè se
>hai un puntatore, invece di copiare l'indirizzo, copi la locazione
>di memoria a cui punta.

http://blogs.dotnethell.it/Regulator/
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