Từ 1 tới 4 trên tổng số 4 kết quả

Đề tài: Hỏi về copy đối tượng trong C#

  1. #1
    Ngày gia nhập
    01 2010
    Bài viết
    2

    Question Hỏi về copy đối tượng trong C#

    Mình muốn tạo một bản copy của một đối tượng, và khi thao tác trên bản copy sẽ không ảnh hưởng đến đối tượng cũ.

    Mình tìm trên mạng thì thấy có cách như sau: lưu đối tượng cũ xuống đĩa, sau đó tạo một đối tượng mới và load file đã lưu.

    Nhưng mình thấy làm như vậy kỳ quá, bạn nào còn cách làm nào khác nữa không giúp mình với. Cám ơn các bạn nhiều.

  2. #2
    Ngày gia nhập
    08 2012
    Bài viết
    574

    Phương thức để sao chép đối tượng đã có trong C#, nhưng là protected. Nói cho đúng là nhân bản.
    Visual C# Code:
    1. protected Object MemberwiseClone()

    Bạn có thể tham khảo thêm tại: http://msdn.microsoft.com/en-us/libr...wiseclone.aspx

  3. #3
    Ngày gia nhập
    01 2010
    Bài viết
    2

    Cái này vẫn chưa được bạn àh. Mình dịch vắn tắt bài tham khảo mà bạn cho link như sau:

    Phương thức MemberwiseClone chỉ tạo ra một shallow copy.

    Shallow copy tức là tạo ra một đối tượng mới, và sau đó copy các trường ngoại trừ trường tĩnh của đối tượng hiện tại vào đối tượng mới. Nếu một trường là kiểu giá trị, thì trường đó sẽ được copy bit-by-bit (cái này đúng là nhân bản). Nhưng nếu một trường là kiểu tham chiếu, thì chỉ có tham chiếu được copy nhưng đối tượng mà nó tham chiếu tới thì không được copy, vì vậy đối tượng gốc và đối tượng mới vẫn tham chiếu cùng một đối tượng.

    Ví dụ, xét một đối tượng X, và X tham chiếu đến hai đối tượng A và B. Trong đó đối tượng B tham chiếu đến đối tượng C. X2 là Shallow copy của X, tức là tạo ra một đối tượng mới X2 cũng tham chiếu đến hai đối tượng A và B.

    Ngược lại với shallow copy là deep copy, tức là tạo ra một đối tượng mới X2 tham chiếu đến 2 đối tượng mới A2 và B2 mà A2 và B2 là nhân bản của A và B. B2 tham chiếu tới C2 mà C2 cũng là nhân bản của C. Đây mới thực sự là cái mà mình muốn.

    Họ cũng đưa ra một số cách để tạo ra deep copy như sau:

    1. Tạo ra một đối tượng mới bằng cách dùng hàm khởi dựng với các tham số truyền vào là thuộc tính, trường của đối tượng cũ. Giả sử rằng tất cả các giá trị của object đều được định nghĩa thông qua hàm khởi dựng. Cái này làm trên C++ thì có thể được (khởi dựng copy), nhưng C# thì rất khó, đặc biệt là với các lớp đã có sẵn (button, lablel, ...)

    2. Dùng phương thức MemberwiseClone để tạo ra shallow copy của một đối tượng, và sau đó gán cho nó đối tượng mới mà đối tượng mới này có các thuộc tính và các trường hoàn toàn giống với đối tượng gốc => Cũng tựa tựa như cách 1.

    3. Serialize đối tượng để tạo deep copy và sau đó khôi phục dữ liệu đã được serialized thành đối tượng mới. Cái này thì giống như cách mình làm là ghi xuống đĩa hoặc RAM sau đó load lên vào một đối tượng mới.

    4. Sử dụng reflection với recursion (chẳng biết cái này là cái gì??, hình như là đệ qui) để thực hiện deep copy => Cái này thì mình không rành lắm.

    Tóm lại là MemberwiseClone chỉ phù hợp khi dùng cho các lớp tự tạo, với số ít field (chẳng hạn như trong bài ví dụ mà họ cho sẵn), hoặc trong các lớp không có field kiểu tham chiếu. Nhưng cái mình cần là trên những lớp có sẵn cơ (button hay textbox ấy)

    Không biết bạn còn cách nào khác không. Giúp mình với, cám ơn bạn nhiều...
    Đã được chỉnh sửa lần cuối bởi thanhdang8x : 20-12-2012 lúc 12:11 AM.

  4. #4
    Ngày gia nhập
    08 2012
    Bài viết
    574

    À, mình nhầm lẫn thật.
    Shallow Clone: cùng tham chiếu tới 1 vùng nhớ.
    Deep Clone: sao chép đối tượng ra vùng nhớ mới.

    Tham khảo trên mạng thì chắc chỉ có thế thôi. Trong .NET Framework 4.0 thì còn dùng ExpressionTreeCloner (mình chẳng biết nó là gì).

    Mấy cái sao chép đối tượng bằng cách dùng RAM có gì không được?
    Còn về Reflection thì mình cũng không biết nhiều về nó.

Các đề tài tương tự

  1. thắc mắc về copy file và kiểm tra tiến trình copy
    Gửi bởi RoboWonder trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 13
    Bài viết cuối: 27-03-2016, 07:15 PM
  2. ADO.NET Hàm Copy file trong c#,copy thiếu dữ liệu
    Gửi bởi gatrongpro trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 0
    Bài viết cuối: 08-12-2013, 09:40 PM
  3. [Hỏi] Copy thiếu khi copy nhiều file
    Gửi bởi toi_loi_acon trong diễn đàn Nhập môn lập trình C#, ASP.NET
    Trả lời: 0
    Bài viết cuối: 10-07-2012, 11:02 AM
  4. Firefox Lỗi: Phải nhấn Ctrl+C hoặc Copy 2 lần mới copy được văn bản.
    Gửi bởi Kevin Hoang trong diễn đàn Thắc mắc chung
    Trả lời: 3
    Bài viết cuối: 17-01-2011, 11:17 PM
  5. Lập trình C Deep Copy - Shallow Copy
    Gửi bởi ooDKNYoo trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 25
    Bài viết cuối: 28-05-2010, 03:59 AM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn