引用类型的对象复制(浅复制和深复制)
引用类型的对象复制,分为浅复制和深复制。。。
浅复制就简单的把地址复制给另一个对象,其中有一个对象发生变化,2个都有变化。
实现方式,实现 ICloneable 接口,调用 MemberwiseClone()方法就可以了。
深复制就完全产生一个新的对象,二者属性一样,但没有任何关联。。
实现方式,可以重新 new 一个对象,也可以通过序列化、反序列化来实现。。
代码:
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
namespace H.DBF
{
/// <summary>
/// Model对象基类
/// </summary>
[Serializable]
public abstract class ObjBase:ICloneable
{
#region ICloneable 成员
/// <summary>
/// 浅复制
/// </summary>
/// <returns></returns>
public object Clone()
{
return this.MemberwiseClone();
}
/// <summary>
/// 深度拷贝,使用序列化方式,在数据量大时速度很慢!
/// </summary>
/// <returns></returns>
public object DeepClone()
{
//使用 序列化/反序列化,在数据量大时相当慢!
object obj;
using (MemoryStream ms = new MemoryStream())
{
BinaryFormatter bf = new BinaryFormatter(null, new System.Runtime.Serialization.StreamingContext());
bf.Serialize(ms, this);
ms.Seek(0, SeekOrigin.Begin);
obj = bf.Deserialize(ms);
ms.Close();
return obj;
}
//ObjBase obj = (ObjBase) System.Activator.CreateInstance(this.GetType());
//obj.TableName = this.TableName;
//obj.Columns = this.Columns;
//return obj;
}
#endregion
}
}
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
namespace H.DBF
{
/// <summary>
/// Model对象基类
/// </summary>
[Serializable]
public abstract class ObjBase:ICloneable
{
#region ICloneable 成员
/// <summary>
/// 浅复制
/// </summary>
/// <returns></returns>
public object Clone()
{
return this.MemberwiseClone();
}
/// <summary>
/// 深度拷贝,使用序列化方式,在数据量大时速度很慢!
/// </summary>
/// <returns></returns>
public object DeepClone()
{
//使用 序列化/反序列化,在数据量大时相当慢!
object obj;
using (MemoryStream ms = new MemoryStream())
{
BinaryFormatter bf = new BinaryFormatter(null, new System.Runtime.Serialization.StreamingContext());
bf.Serialize(ms, this);
ms.Seek(0, SeekOrigin.Begin);
obj = bf.Deserialize(ms);
ms.Close();
return obj;
}
//ObjBase obj = (ObjBase) System.Activator.CreateInstance(this.GetType());
//obj.TableName = this.TableName;
//obj.Columns = this.Columns;
//return obj;
}
#endregion
}
}