架构应该解决好对象的克隆问题

克隆的问题是程序开发中遇到的很基础的问题,一旦涉及,就会占用开发人员很多精力。应该在架构中统一解决

IClone 接口有坑。但有的实现还依赖它。所以去除还是去除不掉。 但可以自行实现去除这个依赖。

 

系统应该提供三个函数:

  DeepClone<T>(this T obj) where T: class

  ShallowClone<T>(this T obj) where T: class

  CopyTo<T>(object source, T toEntity)

 

DeepClone 是深克隆。使用 MemoryStream + BinaryFormatter ,这种方式依赖: Serializable  特性,但是性能较快。可以检测。

ShallowClone 是浅克隆。使用反射调用: MemberwiseClone 方式, 不明白为什么 MemberwiseClone 是 protected 的,而不是 public 的。

CopyTo 是按字段值使用反射方式进行复制。

 

当反射成为唯一的方式的时候,也就无从选择了。还好 .Net 有 Emit ,可以用在基础库实现中(开发成本大,但一次投入,重复利用)。

1. 系统要提供深克隆,浅克隆两种方式,去除 IClone 接口。

IClone接口有很多问题, 如基类实现了克隆接口后, 子类不实现就有问题: http://www.cnblogs.com/newsea/archive/2012/09/07/2674425.html

 

2. 基类拷贝构造函数

如: 

复制代码
public  class  生物
{
    pubic  string Type { get; set; }
    public  int Height { get; set ; }
}

public class 人:生物
{
    public  string Sex { get; set; }
}

public class 花:生物
{
    public string Color { get; set; }
}

生物 sw = FindOne();
if( sw.Type == "") {
    var ren = new 人( sw) ;
}
else {
    var hua = new 花(sw ) ;
}
复制代码

 

而这个基类拷贝构造函数的功能,应该由系统提供,而不是每个类写一个。 实现浅克隆就可以。 利用之前的 CopyTo 方法

 

var ren = new 人();

ren = sw.CopyTo(ren);

 

var hua = new 花();

hua = sw.CopyTo(hua);

3. 深克隆归根到底,就是序列化。

只有能序列化的克隆,才是深克隆。深克隆要选择性能最好的序列化方式。

没有序列化的架构机制,就是耍流氓。

 

4. 克隆和序列化要解决相到引用的问题

类A引用类B,类B引用类A。

可以检测,当相互引用,自动断掉。

 

posted @   NewSea  阅读(347)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端
点击右上角即可分享
微信分享提示