Lütfen aşağıdaki koda bir göz atın (bir C# kitabından alıntı):
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();
}
}
Aşağıdaki çıktıyı ürettiğini anlıyorum:
objectA.val = 20
objectB.val = 20
structA.val = 30
structB.val = 40
Çıktının son iki satırıyla ilgili bir sorunum yok, ancak ilk iki satır bana objectA
ve objectB
nin aynı bellek bloğuna işaret ettiğini söylüyor (çünkü C#'ta nesneler referans türleridir).
Soru, objectA
nın bir kopyası olan objectB
nin bellekte farklı bir alana işaret edecek şekilde nasıl yapılacağıdır. Üyelerini atamaya çalışmanın işe yaramayabileceğini anlıyorum çünkü bu üyeler de referans olabilir. Peki objectB
yi objectA
dan tamamen farklı bir varlık haline nasıl getirebilirim?
Teşekkürler
Yapabilirsin:
class myClass : ICloneable
{
public String test;
public object Clone()
{
return this.MemberwiseClone();
}
}
o zaman yapabilirsin
myClass a = new myClass();
myClass b = (myClass)a.Clone();
N.B. MemberwiseClone()
Geçerli System.Object öğesinin sığ bir kopyasını oluşturur.
Yerleşik bir yol yoktur. MyClass'ın `IClonable' arayüzünü uygulamasını sağlayabilir (ancak bu arayüz kullanımdan kaldırılmıştır) veya kendi Copy/Clone yönteminizi yazabilirsiniz. Her iki durumda da biraz kod yazmanız gerekecektir.
Büyük nesneler için, sadece mevcut kodu yeniden kullanmak için Serileştirme + Serileştirmeyi (bir MemoryStream aracılığıyla) düşünebilirsiniz.
Yöntem ne olursa olsun, "bir kopyanın" tam olarak ne anlama geldiğini dikkatlice düşünün. Ne kadar derine inmeli, hariç tutulması gereken Id alanları var mı vs.
Bu konuda zaten bir soru var, belki onu okuyabilirsiniz
https://stackoverflow.com/questions/78536/cloning-objects-in-c
Örneğin Java'da olduğu gibi Clone() yöntemi yoktur, ancak clase'lerinize bir kopya yapıcı ekleyebilirsiniz, bu da başka bir iyi yaklaşımdır.
class A
{
private int attr
public int Attr
{
get { return attr; }
set { attr = value }
}
public A()
{
}
public A(A p)
{
this.attr = p.Attr;
}
}
Bu, yeni nesne oluşturulurken 'Attr' üyesinin kopyalanması gibi bir örnek olabilir.