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.
Senior Software Engineer, @Microsoft
Ada ve Ege'nin babası ;)
Makale Adedi: 484