C# Shallow Copy ve Deep Copy arasındaki fark

Bazı durumlarda C# projemizde elimizdeki değişkenin bir kopyasını çıkarmamız gerekir.

Örneğin, ekrandaki fatura‘nın veya müşterinin aynısından oluşturalım ama Adı, Adresi, gibi alanların değerlerini değiştirelim sadece.

Bu tip senaryolarda karşımıza iki seçenek çıkıyor; Basit Kopya (Shallow Copy) ve Derin Kopya (Deep Copy)

Shallow Copy, ilgili değişkenin sadece primitive tiplerdeki özelliklerinin değerlerini kopyalar, custom tiplerdeki özelliklerini kopyalamaz.

Senaryomuzda aşağıdaki sınıflar yer alsın;

Eğer Customer sınıfından bir değişkenin kopyasını çıkartmak istersek, aynı tipte yeni bir değişken oluşturup özelliklerin değerlerini atayabiliriz;

Bir sınıfın çok fazla özelliği olduğu durumda bu yol pek verimli olmayacaktır. Sınıfa eklenecek yeni özellikler (PhoneNumber, Status, vs) için kopyalama yaptığımız her yerde güncelleme yapmamız da gerekecek.

Shallow Copy ile bu sorunu şöyle aşabiliyoruz;

Gördüğünüz gibi Customer sınıfına ShallowCopy() isimli bir method ekledik ve içerisinde this.MemberwiseClon(); methodunu çağırdık, Customer sınıfına dönüştürüp geri döndürdük.

Kullanımı;

Fakat bu senaryoda sadece primitive tiplerin (string, int, bool, vs) yeni değişkene kopyalanmasını sağlayabildik.

Custom tiplerin (Address, ShoppingCart, vs) yeni değişkende değerleri orjinal değişkendeki değerlerin referansları olacaktır.

Yani, kopyaladığımız değişkende bir değişiklik yaparsak orjinal değişkendeki değerde değişir.

Aslında değişmez, iki değerinde hafızadaki adresi aynı olacağı için (referans) birinde değişiklik yapınca diğeri de aynı hafıza alanından değişen değeri okuyacak

Elimizdeki değişkenin tamamen yepyeni bir kopyasını çıkartmak istiyorsak, Deep Copy yöntemlerini kullanmalıyız.

Örneğin;

Kullanım örneği;

Bu durumda newCustomer değişkeni customer değişkeninin birebir kopyası olacak. Herhangi bir değeri değiştirilecek olursa customer değişkeni bundan etkinlenmeyecek.

Öncelikle MemoryStream kullanarak kopyalama için hafızada bir alan oluşturuyoruz, BinaryFormatter ile bu alana elimizdeki değişkeni serilize ediyoruz.

Son olarak aynı alanın başına gidip tekrar Customer sınıfına dönüştürüp geri döndürüyoruz.

Böylece istediğimiz değişkenlerin kopyalarını oluşturabiliriz.

blog comments powered by Disqus

Engin Polat hakkında

Senior Software Engineer, @Microsoft

Ada ve Ege'nin babası ;)

Kategoriler

İstatistik

Makale Adedi: 484

Creative Commons Lisansı