Visual Basic'de, verileri yeni bir şekilde değiştirmek için nesnenin bir kopyasını oluşturmak sıkça gereklidir, bu da orijinal yapıyı etkilememelisiniz. Yüzeysel (shallow) ve derin (deep) kopyalama arasında ayrım yapma ihtiyacı ortaya çıkar, özellikle nesneler iç içe referans türleri içeriyorsa.
Soru Tarihi:
Yüzeysel kopyalama, yalnızca ilkel özelliklerin değerlerini ve iç nesnelere olan referansları kopyalar, oysa derin kopyalama tüm iç nesnelerin yeni örneklerini oluşturur. Bu ayrım, koleksiyonlar veya diğer nesneleri içeren karmaşık verilerle çalışırken kritiktir.
Sorun:
Bir nesneyi referans üzerinden kopyaladığınızda veya standart MemberwiseClone yöntemini kullandığınızda, iç nesneler değiştiğinde orijinal yapı ve kopya birlikte değişir - bu iş mantığı için tehlikeli olabilir ve zor tespit edilen hatalara yol açabilir.
Çözüm:
VB.NET'te doğrudan derin kopyalama yoktur, bu nedenle bunu elle yapmalı veya serileştirme kullanmalısınız. Genellikle, tüm iç nesnelerin yeni örneklerini oluşturarak DeepCopy adlı özel bir yöntem uygulanır.
Yüzeysel ve derin kopyalamanın kod örneği:
Class Person Public Name As String Public Address As Address ' Yüzeysel kopyalama Public Function ShallowCopy() As Person Return CType(Me.MemberwiseClone(), Person) End Function ' Derin kopyalama Public Function DeepCopy() As Person Dim copy As Person = CType(Me.MemberwiseClone(), Person) copy.Address = New Address() With {.City = Me.Address.City} Return copy End Function End Class Class Address Public City As String End Class
Anahtar noktalar:
Visual Basic'de bir sınıf nesnesini kopyalarken = operatörü ne döndürür?
Cevap: Referans türleri için = operatörü bir referansı atar, değerleri kopyalamaz. Bu nedenle her iki değişken de aynı nesneye işaret eder.
Dim a As New Person() Dim b As Person = a ' Artık a ve b aynı nesneye referans veriyor
Derin kopyalama için MemberwiseClone kullanabilir miyiz?
Cevap: Hayır. MemberwiseClone yöntemi yalnızca yüzeysel kopyalamayı uygular - tüm iç referans türleri referans üzerinden kopyalanır.
Serileştirme neden her zaman evrensel bir derin kopyalama yöntemi değildir?
Cevap: Serileştirme yalnızca serileştirilebilir nesnelerle çalışır ve Object türündeki veya Serializable olarak işaretlenmemiş özellikleri desteklemeyebilir. Ayrıca, serileştirme standart kopyalamadan daha yavaş çalışır.
Müşteri, yeni bir sipariş oluşturmak için = operatörünü kullanarak bir sipariş nesnesini kopyalar, iç içe liste kalemlerinin iki nesneye de birininki le kalmış olduğunu fark etmeden.
Artılar: Hızlı, basit
Eksiler: Bir siparişteki değişiklikler diğerini de değiştiriyor - ürünlerin hesaplanmasında kritik hatalar.
Siparişi tüm iç ürünler ve teslimat adresi ile birlikte kopyalayan bir DeepCopy yöntemi uygulanmıştır.
Artılar: Verilerin güvenilir şekilde ayrılması, doğru iş mantığı
Eksiler: Nesne yapısına dikkat etmek gerek, daha fazla destek kodu gerektirir.