Come fare una copia di un object in c #

Diciamo che ho una class:

class obj { int a; int b; } 

e poi ho questo codice:

 obj myobj = new obj(){ a=1, b=2} obj myobj2 = myobj; 

Ora il codice sopra fa riferimento al primo object. Quello che voglio è che myobj2 riferisca a una copia di myobj con le modifiche non riflesse nell’originale. Ho cercato SO e le soluzioni finora sembrano complicate. C’è un modo più semplice per farlo. Sto usando .net 4.5

Le proprietà nel tuo object sono tipi di valore e puoi usare una copia superficiale in tale sutura come quella:

 obj myobj2 = (obj)myobj.MemberwiseClone(); 

Ma in altre situazioni come se alcuni membri fossero tipi di riferimento, allora hai bisogno di Deep Copy. Puoi ottenere una copia profonda dell’object usando questo metodo:

 public static T DeepCopy(T other) { using (MemoryStream ms = new MemoryStream()) { BinaryFormatter formatter = new BinaryFormatter(); formatter.Serialize(ms, other); ms.Position = 0; return (T)formatter.Deserialize(ms); } } 

Informazioni aggiuntive: (puoi anche leggere questo articolo da MSDN )

La copia superficiale sta creando un nuovo object e quindi copiando i campi non statici dell’object corrente sul nuovo object. Se un campo è un tipo valore, viene eseguita una copia bit per bit del campo; per un tipo di riferimento, il riferimento viene copiato ma l’object di riferimento non lo è; quindi l’object originale e il suo clone si riferiscono allo stesso object.

La copia profonda sta creando un nuovo object e quindi copia i campi non statici dell’object corrente sul nuovo object. Se un campo è un tipo valore, viene eseguita una copia bit per bit del campo. Se un campo è un tipo di riferimento, viene eseguita una nuova copia dell’object indicato.

Puoi usare MemberwiseClone

 obj myobj2 = (obj)myobj.MemberwiseClone(); 

La copia è una copia poco profonda che significa che le proprietà di riferimento nel clone puntano agli stessi valori dell’object originale ma che non dovrebbe essere un problema nel tuo caso in quanto le proprietà in obj sono di tipo valore.

Se possiedi il codice sorgente, puoi anche implementare ICloneable

Sembra che tu stia cercando un modo semplice per accoppiare in modo univoco i tuoi oggetti, ma mantenere la possibilità di consentire la modifica dei valori quando necessario.

Un modo per passare i valori tra le classi può essere così.

 public class Folders { public string Source { get; private set; } public string Target { get; private set; } public Folders(string source, string target) { if (String.IsEmptyOrNull(source) && String.IsEmptyOrNull(target)) { throw new Exception("Null Parameter"); } else { Source = source; Target = target; } } } 

Quindi abbiamo creato un object particolare chiamato Folders . Questo può ora essere chiamato in un file di seconda class come questo:

 public bool CopyDirectory(string _source, string _destination) { var dirStack = new Stack(); dirStack.Push(new Folders(_source, _destination)); // Perform stuff related to this method. } 

Quindi nella nostra seconda class stiamo passando i parametri dei metodi a questa class originale, che stabilirà i nostri valori e ci consentirà di manipolarli.

Abbiamo un altro modo, quindi in una class separata diciamo che volevamo usare il nostro Costruttore per passare le variabili. Ciò consentirà un riferimento iniziale quindi la possibilità di deviare effettivamente se lo si sceglie.

 public class DirectoryManagement { private Folders _folder { get; private set; } public DirectoryManagement(Folders folder) { _folder = folder; } } 

Pertanto, quando utilizziamo questa modalità, stiamo garantendo che i parametri inizialmente passati alla nostra class Folders vengano passati alla nostra nuova class DirectoryManagement . Il che ci consentirebbe di colbind questi valori ad altre variabili, utilizzare questi valori o qualunque siano le nostre esigenze.

Non sono sicuro che questo approccio o l’approccio elencato sia la soluzione ideale. Ma pensavo di presentare un altro modo per passare e usare le variabili esistenti. Inoltre, alcuni dettagli su MemberwiseClone possono essere trovati qui.