C#’ta Shallow Copy (Yüzeysel Kopya) ve Deep Copy (Derin Kopya) çok sık karıştırılır. Bu makalemizde bu kavramları örnekler ve benzetmelerle açıklamaya çalışacağım.
Shallow Copy (Yüzeysel Kopya)
Bir nesnenin ilk seviyedeki değerlerini kopyalar. Ancak referans tipleri (class, array, list vs.) için sadece referansı kopyalar, içindeki nesnelerin kendisini kopyalamaz.
Yani orijinal nesnedeki referans tipleriyle, kopyalanan nesne aynı bellek adresini paylaşır.
class Person
{
public string Name { get; set; }
public Address Address { get; set; }
public Person ShallowCopy()
{
return (Person)this.MemberwiseClone(); // Shallow Copy
}
}
class Address
{
public string City { get; set; }
}
class Program
{
static void Main()
{
Person p1 = new Person { Name = "Ali", Address = new Address { City = "İstanbul" } };
Person p2 = p1.ShallowCopy();
p2.Name = "Veli";
p2.Address.City = "Ankara";
Console.WriteLine(p1.Name); // Ali
Console.WriteLine(p1.Address.City); // ❗ Ankara (referans aynı olduğu için değişti)
}
}
Görüldüğü gibi Name
değişmez, çünkü string immutable’dır ve yeni değer atanır. Ama Address.City
değişir, çünkü p1.Address
ve p2.Address
aynı adresi gösterir.
Deep Copy (Derin Kopya)
Bir nesnenin tamamını bağımsız şekilde kopyalar. İçinde başka nesneler varsa, onlar da yeni bellek alanına kopyalanır. Orijinal nesneyle kopya arasında hiçbir ortak referans kalmaz.
class Person
{
public string Name { get; set; }
public Address Address { get; set; }
public Person DeepCopy()
{
Person clone = (Person)this.MemberwiseClone();
clone.Address = new Address { City = this.Address.City }; // Bağımsız nesne
return clone;
}
}
class Address
{
public string City { get; set; }
}
class Program
{
static void Main()
{
Person p1 = new Person { Name = "Ali", Address = new Address { City = "İstanbul" } };
Person p2 = p1.DeepCopy();
p2.Name = "Veli";
p2.Address.City = "Ankara";
Console.WriteLine(p1.Name); // Ali
Console.WriteLine(p1.Address.City); // İstanbul (bağımsız kopya olduğu için değişmedi)
}
}
Bu kez p1.Address.City
değişmiyor, çünkü deep copy yaptık ve Address
nesnesi ayrı bir yerde oluşturuldu.
Gerçek Hayat Benzetmesi
- Shallow Copy: Bir evin anahtarının fotokopisini almak gibi. İkisi de aynı kapıyı açıyor. Eğer içerideki mobilyaları değiştirirsen, ikisi de aynı evde değişiklik görür.
- Deep Copy: Evin aynısını sıfırdan yapmak gibi. Senin evinde yaptığın değişiklik, diğer eve etki etmez.
Özet Tablo
Özellik | Shallow Copy | Deep Copy |
---|---|---|
Referans tipler | Referans adresi kopyalanır | Yeni nesne oluşturulur |
Değişiklik etkisi | Orijinal nesne de etkilenir | Orijinal nesne etkilenmez |
Bellek kullanımı | Daha az | Daha fazla |
Kullanım alanı | Performans önemliyse, küçük kopyalar | Tam bağımsızlık gerekiyorsa |