Shallow Copy và Deep Copy trong C #

* Có 2 khái niệm khi nhân bản một đối tượng trong lập trình.

– Shallow Copy (Sao lưu ngoài) sẽ nhân bản chỉ cấu trúc của đối tượng chứ không tạo ra một bản sao khác trong chương trình.

– Trong khi đó Deep Copy (Sao lưu) sẽ nhân bản không chỉ cấu trúc mà mọi thứ trong đối tượng đó thành một đối tượng hoàn toàn mới.

* Ví dụ: Khi chúng ta có một tập hợp A  gồm các phần tử {a, b, c, …}

– Shallow Copy sang một tập hợp B sẽ tạo thành một tập hợp cùng chứa các phần từ {a, b, c}. Điều đó có nghĩa là nếu bạn xóa phần tử a trong tập hợp A thì ở phần tử B cũng chỉ còn {b, c} do nó cùng chứa tại một vị trí trong bộ nhớ chứ không phải tạo một bản sao hoàn chỉnh của các phần tử bên trong của tập hợp.

– Deep Copy thì lại hoàn toàn ngược lại. Tập hợp B sẽ chứa tất cả các đối tượng {a, b, c} nhưng nó là một thực thể độc lập so với tập hợp A. Điều đó cũng có nghĩa là nếu bạn xóa đi phần từ bên tập hợp A thì trong tập hợp B vẫn không có gì thay đổi.

* Với việc nhân bản (Copy) một đối tượng trong C# thường chúng ta sẽ dùng 2 phương thức sau để có thể nhân bản một cách dễ dàng:

/// <summary>
/// Sử dụng để nhân bản một đối tượng trong lập trình
/// Trường hợp là Entity Object sẽ không tính Entity Key
/// </summary>
/// <typeparam name=”T”> Loại của đối tượng cần sử lý</typeparam>
/// <param name=”other”>Đối tượng cần nhân bản</param>
/// <returns></returns>
public static T LKCopy<T>(this T other)
{
using (MemoryStream ms = new MemoryStream())
{
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(ms, other);
ms.Position = 0;

dynamic result = (T)formatter.Deserialize(ms);
try
{
if (result is EntityObject)
{
result.EntityKey = null;
}
}
catch { }

return result;
}
}

=> Ở đây có thêm một phần kiểm tra xem đây có phải là một Entity Object hay không dùng để gán giá trị null cho EntityKey vì nếu để EntityKey cũng được nhân bản thì thực tế bạn đang làm việc trên một Object duy nhất của chương trình.

* Lưu ý: Cách còn lại sử dụng Dynamic sẽ được đưa lên sau nếu có ai quan tâm đến vấn đề này

Tagged: , , , , , , , , , ,

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: