| 注册
请输入搜索内容

热门搜索

Java Linux MySQL PHP JavaScript Hibernate jQuery Nginx
UBOMerri
10年前发布

c#实现深拷贝代码

浅拷贝是指源对象与拷贝对象共用一份实体,仅仅是引用的变量不同(名称不同)。对其中任何一个对象的改动都会影响另外一个对象。举个例子,一个人一开始叫张三,后来改名叫李四了,可是还是同一个人,不管是张三缺胳膊少腿还是李四缺胳膊少腿,都是这个人倒霉。

深拷贝是指源对象与拷贝对象互相独立,其中任何一个对象的改动都不会对另外一个对象造成影响。举个例子,一个人名叫张三,后来用他克隆(假设法律允许)了另外一个人,叫李四,不管是张三缺胳膊少腿还是李四缺胳膊少腿都不会影响另外一个人。比较典型的就是Value(值)对象,如预定义类型Int32,Double,以及结构(struct),枚举(Enum)等。

using System.IO;  using System.Runtime.Serialization;  using System.Runtime.Serialization.Formatters.Binary;    /// <summary>  /// Reference Article http://www.codeproject.com/KB/tips/SerializedObjectCloner.aspx  /// Provides a method for performing a deep copy of an object.  /// Binary Serialization is used to perform the copy.  /// </summary>  public static class ObjectCopier  {      /// <summary>      /// Perform a deep Copy of the object.      /// </summary>      /// <typeparam name="T">The type of object being copied.</typeparam>      /// <param name="source">The object instance to copy.</param>      /// <returns>The copied object.</returns>      public static T Clone<T>(T source)      {          if (!typeof(T).IsSerializable)          {              throw new ArgumentException("The type must be serializable.", "source");          }            // Don't serialize a null object, simply return the default for that object          if (Object.ReferenceEquals(source, null))          {              return default(T);          }            IFormatter formatter = new BinaryFormatter();          Stream stream = new MemoryStream();          using (stream)          {              formatter.Serialize(stream, source);              stream.Seek(0, SeekOrigin.Begin);              return (T)formatter.Deserialize(stream);          }      }  }