Mungkin Duplikat: Bagaimana anda lakukan dalam salinan objek dalam .Net (C# specifically)?
Silakan lihat kode di bawah ini (kutipan dari C# buku):
public class MyClass
{
public int val;
}
public struct myStruct
{
public int val;
}
public class Program
{
private static void Main(string[] args)
{
MyClass objectA = new MyClass();
MyClass objectB = objectA;
objectA.val = 10;
objectB.val = 20;
myStruct structA = new myStruct();
myStruct structB = structA;
structA.val = 30;
structB.val = 40;
Console.WriteLine("objectA.val = {0}", objectA.val);
Console.WriteLine("objectB.val = {0}", objectB.val);
Console.WriteLine("structA.val = {0}", structA.val);
Console.WriteLine("structB.val = {0}", structB.val);
Console.ReadKey();
}
}
Aku mengerti itu menghasilkan output di bawah ini:
objectA.val = 20
objectB.val = 20
structA.val = 30
structB.val = 40
Dua baris terakhir dari output saya tidak punya masalah dengan, tetapi dua yang pertama memberitahu saya bahwa objectA
dan objectB
yang menunjuk ke memori yang sama blok (karena di C#, benda-benda jenis referensi).
Pertanyaannya adalah bagaimana membuat objectB
, salinan objectA
sehingga poin ke daerah yang berbeda di memori. Saya memahami bahwa mencoba untuk menetapkan anggota mereka mungkin tidak bekerja karena mereka anggota dapat menjadi referensi, terlalu. Jadi bagaimana aku pergi tentang membuat objectB
yang benar-benar berbeda dari entitas objectA
?
Terima kasih
Anda bisa melakukan:
class myClass : ICloneable
{
public String test;
public object Clone()
{
return this.MemberwiseClone();
}
}
maka yang dapat anda lakukan
myClass a = new myClass();
myClass b = (myClass)a.Clone();
N. B. MemberwiseClone()
Menciptakan salinan dangkal dari Sistem saat ini.Objek.
Tidak ada built-in cara. Anda dapat memiliki MyClass melaksanakan IClonable
interface (tapi itu adalah semacam usang) atau hanya menulis anda sendiri Copy/Clone metode. Dalam kedua kasus, anda akan memiliki untuk menulis beberapa kode.
Untuk benda-benda besar anda bisa mempertimbangkan untuk Serialisasi + Deserialization (melalui MemoryStream), hanya untuk menggunakan kembali kode yang ada.
Apapun metode, berpikir hati-hati tentang apa "copy" berarti persis. Seberapa jauh harus pergi, ada Id bidang yang akan dikecualikan dll.
Cara termudah untuk melakukan ini adalah untuk menulis sebuah copy constructor pada class MyClass.
Sesuatu seperti ini:
namespace Example
{
class MyClass
{
public int val;
public MyClass()
{
}
public MyClass(MyClass other)
{
val = other.val;
}
}
}
Kedua konstruktor hanya menerima parameter dari jenis sendiri (salah satu yang ingin anda salin) dan menciptakan objek baru yang ditetapkan dengan nilai yang sama
class Program
{
static void Main(string[] args)
{
MyClass objectA = new MyClass();
MyClass objectB = new MyClass(objectA);
objectA.val = 10;
objectB.val = 20;
Console.WriteLine("objectA.val = {0}", objectA.val);
Console.WriteLine("objectB.val = {0}", objectB.val);
Console.ReadKey();
}
}
output:
objectA.val = 10
objectB.val = 20
Ada's sudah pertanyaan tentang hal ini, anda mungkin bisa baca ini
https://stackoverflow.com/questions/78536/cloning-objects-in-c
Ada's tidak ada Clone() metode seperti itu ada di Jawa misalnya, tapi anda bisa menyertakan copy constructor di kelas pada anda, bahwa's pendekatan lain yang baik.
class A
{
private int attr
public int Attr
{
get { return attr; }
set { attr = value }
}
public A()
{
}
public A(A p)
{
this.attr = p.Attr;
}
}
Ini akan menjadi contoh, menyalin anggota 'Y' ketika membangun objek baru.