C#的深拷贝,需要自己实现逻辑,目前我没有发现微软提供了可供调用的API。微软只是提供ICloneable接口,此接口只是为我们提供了一个规范,必须实现object Clone();方法,如下代码:
public class Person : ICloneable
{
public int ID { get; set; }
public string Name { get; set; }
Object Clone(){
Person newPerson = new Person();
newPerson.ID = this.ID;
newPerson.Name = this.Name;
return newPerson;
}
}
下面是调用方法:
Person oldPerson = new Person();
oldPerson.ID = 1;
oldPerson.Name = "Terry";
Person newPerson = (Person)oldPerson.Clone();
newPerson.Name = "Harry";
Console.WriteLine("old person's name is " + oldPerson.Name);//他们输出的Name是不一致的,所以说实现了深拷贝
Console.WriteLine("new person's name is " + newPerson.Name);
此时可能会有人问了,既然具体实现逻辑还要自己写,干嘛要继承ICloneable接口呢?
其实微软定义了这么个接口,是基于软件工程方面的考虑,提高代码的规范性。试想如果一个项目组有多个人在实现深拷贝,而又没有继承ICloneable这个接口,那么结果会是什么样呢?可以肯定的是,在接口、拷贝方法命名上会有多个版本存在。
当然,如果我们不想这么麻烦,可以考虑使用反射的机制来实现深拷贝,不过这样的话对性能会有影响,下面是样例代码:
public static class ExntedHelper
{
/// <summary>
/// 深复制
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="source"></param>
/// <returns></returns>
public static T CopySameFieldObject<T>(this Object source)
{
Type _SrcT = source.GetType();
Type _DestT = typeof(T);
// 构造一个要转换对象实例
Object _Instance = _DestT.InvokeMember("", BindingFlags.CreateInstance, null, null, null);
// 这里指定搜索所有公开和非公开的字段
FieldInfo[] _SrcFields = _SrcT.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
// 将源头对象的每个字段的值分别赋值到转换对象里,因为假定字段都一样,这里就不做容错处理了
foreach (FieldInfo field in _SrcFields)
{
if (field.GetValue(source) != null)
_DestT.GetField(field.Name, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance).
SetValue(_Instance, field.GetValue(source));
}
return (T)_Instance;
}
}
调用代码:
Person oldPerson = new Person();
oldPerson.ID = 1;
oldPerson.Name = "Terry";
Person newPerson = oldPerson.CopySameFieldObject<Person>();
newPerson.Name = "Harry";
Console.WriteLine("old person's name is " + oldPerson.Name);//他们输出的Name是不一致的,所以说实现了深拷贝
Console.WriteLine("new person's name is " + newPerson.Name);
本文探讨了在C#中实现深拷贝的方法,包括继承ICloneable接口和使用反射机制。深入解释了接口在提高代码规范性方面的作用,并对比了两种方法在性能上的差异。
1314

被折叠的 条评论
为什么被折叠?



