程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#中Object的深拷貝

C#中Object的深拷貝

編輯:C#入門知識

簡介:

C#中System.Object 是所有類類型、結構類型、枚舉類型和委托類型的基類。可以說它是類型繼承的基礎。System.Object包括一個用於創建當前對象實例的一份拷貝的MemberwiseClone的成員方法。

問題描述:

System.Object的MemberwiseClone方法創建一個新對象的淺拷貝,並把當前對象實例的非靜態字段拷貝至新對象實例中。通過屬性,對象拷貝能夠正確執行:如果屬性是值類型,那麼將按位拷貝數據,如果屬性是引用類型,那麼將拷貝原始對象的引用,也就是說,克隆對象指向同一個對象實例。這就意味著MemberwiseClone方法並未創建一個對象的深拷貝。

解決方法:

有許多方法實現類對象的深拷貝,下面我將通過示例介紹其中的兩種:

  1.通過序列化、反序列化實現深拷貝

  2.通過反射實現深拷貝

1、通過序列化、反序列化實現對象的深拷貝

ICloneable接口使得開發者定制實現Clone方法用以創建一個已存對象的深拷貝。通常Object.MemberwiseClone方法幫助開發者創建一份已存對象的拷貝,但是創建的是這個對象的淺拷貝。序列化是指將對象狀態存儲為二進制流的過程,而反序列化是指將而二進制流轉換為原始對象的過程。在.Net中有許多方法可以實現序列化和反序列化,例如二進制序列化、XML序列化、數據約定序列化等等。二進制序列化比XML序列化快速,且二進制序列化使用私有、公有字段,因而二進制序列化是實現序列化和反序列化的不錯選擇。

通過序列化和反序列化,可以創建對象的深拷貝。需要注意的是,所有類型只有標記為[serializable]特性才能實現序列化和反序列化。

示例程序:

首先創建Employee類,它包含Department類型的屬性,Employee類繼承ICloneable接口並且實現Clone方法。運用二進制格式化器(binary formater),實現對象的序列化和反序列化為一個新對象。

View Code

也可以通過擴展方法實現:

               T CopyObject<T>(                (MemoryStream stream =                   BinaryFormatter formatter =                   stream.Position =                         }

2.通過反射實現深拷貝

反射用於獲取運行時對象原始信息。運用System.Reflection名字空間的類可以獲取運行史對象時的信息,從已存對象創建類型實例,並訪問其屬性及調用方法。考慮一下代碼,我創建了一個接受Object參數的靜態方法,並且返回同樣類型的一個新實例。

View Code

這也可以通過以下的擴展方法實現。

View Code

以下是示例代碼及輸出:

View Code

結束語:

通過序列化和反射我們可以實現對象的深拷貝。運用序列化實現深拷貝的唯一不足之處在於必須將對象標記為Serializable。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved