C# Shallow – Deep Copy

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

ÖzellikShallow CopyDeep Copy
Referans tiplerReferans adresi kopyalanırYeni nesne oluşturulur
Değişiklik etkisiOrijinal nesne de etkilenirOrijinal nesne etkilenmez
Bellek kullanımıDaha azDaha fazla
Kullanım alanıPerformans önemliyse, küçük kopyalarTam bağımsızlık gerekiyorsa