C# 通用Clone

浅拷贝:可以直接调用this.MemberwiseClone()完成

深拷贝:

Clone基类:

    [Serializable]
    class BaseClone<T>
    {
        public virtual T Clone()
        {
            MemoryStream memoryStream = new MemoryStream();
            BinaryFormatter formatter = new BinaryFormatter();
            formatter.Serialize(memoryStream, this);
            memoryStream.Position = 0;
            return (T)formatter.Deserialize(memoryStream);
            
        }
    }

需要Clone的类加上[Serializable]并且继承BaseClone<T>直接调用Clone方法就可以完成深拷贝

转载于:https://www.cnblogs.com/FlyCat/archive/2012/09/25/2703064.html

### C# 和 PHP 中的 Clone 操作 #### C# 的 `Clone` 方法详解 在 C# 编程语言中,提供了 `Clone` 方法用于对象复制。此方法分为浅拷贝和深拷贝两种形式[^1]。 - **浅拷贝**:仅复制对象本身及其值类型的字段;对于引用类型,则只复制引用而不创建新的实例。 - **深拷贝**:不仅复制对象本身以及其内部的所有成员变量(无论是值类型还是引用类型),还会递归地复制这些成员所指向的对象。 为了实现更复杂的克隆行为,在类中可以重写 `MemberwiseClone()` 函数或者利用序列化机制完成完整的深拷贝过程。 ```csharp public class Person : ICloneable { public string Name { get; set; } public int Age { get; set; } // 实现ICloneable接口的方法 public object ShallowCopy() => this.MemberwiseClone(); // 自定义深拷贝逻辑 public object DeepCopy(){ using (var ms = new MemoryStream()){ var formatter = new BinaryFormatter(); formatter.Serialize(ms, this); ms.Position = 0; return (Person)formatter.Deserialize(ms); } } } ``` #### PHP 的 `__clone` 魔术方法解析 而在 PHP 中则存在名为 `__clone` 的魔术函数[^2]: 每当使用关键字 `clone` 创建某个对象的新副本时就会触发这个特殊的方法被执行。开发者可以在其中加入额外处理步骤以确保新旧两个实体间的关系正确无误——比如调整某些依赖项或是重新分配随机数种子等操作。 ```php class ExampleClass { private $property; function __construct($value){ $this->property = $value; } // 定义__clone方法来进行必要的初始化工作 public function __clone(){ // 这里可以根据需要修改属性或执行其他动作 $this->property .= ' cloned'; } } $originalObject = new ExampleClass('Original'); $newInstance = clone $originalObject; echo $newInstance->property . "\n"; // 输出:"Original cloned" ``` #### 应用场景举例 当面对频繁重复相似任务的情况时,预先构建好基础模板之后再基于它派生出多个变体不失为一种明智的选择[^3]。例如在一个图形编辑器应用里面绘制多边形形状的时候,先建立一个通用框架随后依据不同参数微调各个顶点位置即可快速生成一系列略有差别的几何图案而无需每次都从头做起。 另外值得注意的是尽管两者都能达到创造新个体的目的但是由于各自的工作原理有所区别因此适用范围也存在一定差异[^4]。通常来说如果希望获得完全独立互不干扰的数据结构那么应当优先考虑采用深拷贝策略;反之若是仅仅出于性能优化考量想要节省内存空间的话则可以选择效率更高的浅层复制方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值