有一些概念我们清楚,但在实际中不知道如何去用,这往往是C#初学者的一个共同的问题,今天我来讲的就是“浅表拷贝”,简单来说就是把一个对象,一模一样的复制出来一份来,但浅表拷贝只复制原对象的引用地址,在改变新对象时,原来对象不会改变,而深表拷贝是完全拷贝,在改变新对象时,原对象也会受到影响。
以下是浅表拷贝的实现,利用了MemberwiseClone方法
class People
{
public string Name { get; set; }
public string Email { get; set; }
public People ShallowCopy()
{
//直接使用内置的浅拷贝方法返回
return (People)this.MemberwiseClone();
}
}
class Program
{
static void Main(string[] args)
{
//浅拷贝后的对象的值类型字段更改不会反映到源对象,
//而赋值运算后的对象的值类型字段更改会反映到源对象
People p1 = new People { Name = "zzl", Email = "bfyxzls@sina.com" };
People p2 = p1.ShallowCopy();
Console.WriteLine(p1.Name);
Console.WriteLine(p2.Name);
Console.ReadKey();
}
}
我对深拷贝进行了封装,如果是深拷贝也类似这样去做
#region 对象的深拷贝
//对于 Class的对象和数组,会Copy地址一份。[从而改变B时,A也被改变了],它为浅表拷贝
//而对于其它内置的int/string/Enum/struct/object类型,则进行值copy,它为深表拷贝
/// <summary>
/// 警告列举
/// </summary>
public enum warn
{
/// <summary>
/// 类型不相同
/// </summary>
TypeWarn = 1,
/// <summary>
/// 转换成功
/// </summary>
Success = 2,
/// <summary>
/// 转换失败
/// </summary>
Fail = 3,
}
/// <summary>
/// 泛型类
/// </summary>
/// <typeparam name="T1"></typeparam>
/// <typeparam name="T2"></typeparam>
public class Compare<T1, T2> : ICloneable where T1 : class
{
private T1 T11;
/// <summary>
/// 浅拷贝
/// </summary>
/// <param name="t1"></param>
/// <param name="t2"></param>
public warn CopyEntity(T1 t1, ref T2 t2)
{
T11 = t1;
if (!t1.GetType().Equals(t2.GetType()))
return warn.TypeWarn;
try
{
t2 = (T2)this.Clone();
return warn.Success;
}
catch (Exception)
{
return warn.Fail;
}
}
#region ICloneable Members
public object Clone()
{
return T11;
}
#endregion
}
#endregion
OK,现在我有一个people对象,希望得到一个与people对象实现p1完全相同的对象p2,如何去做,如果是去new一个people对象也是可以的,但这在开发时间的浪费是可想而知的,要把所有属性抄写一遍,现在我们可以用封装好的深拷贝来实现。
#region 浅拷贝
People p1 = new People { Name = "zzl", Email = "bfyxzls@sina.com" };
People p2 = new People();
Compare<People, People> c = new Compare<People, People>();
c.CopyEntity(p1, ref p2);
Console.WriteLine(p1.Name + p1.Email);
Console.WriteLine(p2.Name + p2.Email);
#endregion
OK, 从输出结果看这两个对象是相同的。