首页 > 其他分享 >.NET浅复制和深复制

.NET浅复制和深复制

时间:2024-05-30 17:58:12浏览次数:12  
标签:MyObject 对象 Value ShallowCopy 复制 NET original

浅复制和深复制

浅复制(Shallow Copy)和深复制(Deep Copy)是在编程中用于复制对象的两种方式。浅复制复制的是对象的引用(指针),而深复制则复制对象的实际值。

在.NET中,浅复制可以通过MemberwiseClone方法实现,而深复制则需要自己定义复制逻辑,手动复制对象的字段。

示例代码

public class MyObject : ICloneable
{
    public int Value { get; set; }
    
    // 浅复制
    public object ShallowCopy()
    {
        return this.MemberwiseClone();
    }
    
    // 深复制
    public object DeepCopy()
    {
        return new MyObject { Value = this.Value };
    }
    
}

class Program
{
    static void Main(string[] args)
    {
        MyObject original = new MyObject { Value = 5 };
        
        // 浅复制
        MyObject shallowCopy = (MyObject)original.ShallowCopy();
        
        // 深复制
        MyObject deepCopy = (MyObject)original.DeepCopy();
        
        // 修改原始对象的值,看看浅复制和深复制的对象是否受影响
        original.Value = 10;
        
        Console.WriteLine($"Original: {original.Value}");
        Console.WriteLine($"Shallow Copy: {shallowCopy.Value}");
        Console.WriteLine($"Deep Copy: {deepCopy.Value}");
        
        // 输出结果将显示浅复制的对象的值也被修改了,而深复制的对象的值未改变
    }
}

在这个例子中,MyObject类实现了ICloneable接口,并提供了ShallowCopyDeepCopy方法。ShallowCopy方法使用了MemberwiseClone,而DeepCopy方法则是通过创建一个新实例并复制每个字段来实现深复制。

当你修改原始对象的Value属性时,浅复制的对象会反映这个改变,而深复制的对象则保持原样。这展示了浅复制和深复制的区别。

这种创建对象的方式,也是设计模式中-原型模式的一种实现:用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。

标签:MyObject,对象,Value,ShallowCopy,复制,NET,original
From: https://www.cnblogs.com/cqai/p/18222933

相关文章

  • asp.net web api 接口内调用多个远程接口优化
    提高查询速度的远程接口优化;[ApiController][Route("[controller]")]publicclassShippingCostController:ControllerBase{privatereadonlyShippingCostService_shippingCostService;publicShippingCostController(ShippingCostServiceshippingCostServ......
  • asp.net web api 接口控制并发研究(临时性方法)
    有一个业务场景,接口的业务逻辑非常复杂,对数据库的压力比较大,希望限制下接口的并发数量,研究了下:usingMicrosoft.AspNetCore.Mvc;usingSystem.Collections.Concurrent;usingSystem.Threading.Tasks;namespaceTestBingFa.Controllers{[ApiController][Route("[c......
  • 在kubernetes里使用seccomp限制容器的系统调用
    目录一.系统环境二.前言三.系统调用简介四.使用seccomp限制docker容器系统调用五.在kubernetes里使用seccomp限制容器的系统调用5.1配置seccomp允许pod进行所有系统调用5.2配置seccomp禁止pod进行所有系统调用5.3配置seccomp允许pod进行50个系统调用六.总结一.系统环境本文主......
  • dotnet封装一个配置工具类
    usingMicrosoft.Extensions.Configuration;namespaceweb.tools;publicclasssettingHelper{publicstaticIConfiguration_config{get;set;}publicsettingHelper(IConfigurationconfiguration){_config=configuration;}//......
  • 面试官:说说Netty的核心组件?
    Netty核心组件是指Netty在执行过程中所涉及到的重要概念,这些核心组件共同组成了Netty框架,使Netty框架能够正常的运行。Netty核心组件包含以下内容:启动器Bootstrap/ServerBootstrap事件循环器EventLoopGroup/EventLoop通道Channel通道处理器ChannelHandler通道......
  • CATIA二次开发VBA入门(4)——进程外开发环境搭建,vb.net在Visual Studio中开发,创建圆柱曲
    目录引出vb.net和vb6.0进程外开发环境搭建vb.net开发环境搭建《CATIA二次开发技术基础》模板添加宏库引用vs开发环境初步vs中的立即窗口对象浏览器建立模板案例:创建一堆圆柱曲面第一步:录制宏第二步:代码精简第三步:for循环改造第四步:人机交互改造窗口模态设置导出窗口......
  • .NET|--WPF|--如何使用LINQPad创建一个WPF示例
    1.安装包管理器#搜索框内需要填入↓"id=Microsoft.NETCore.App""id=Microsoft.WindowsDesktop.App.Ref"2.代码voidMain(){ varapp=newSystem.Windows.Application(); varmainWindow=newSystem.Windows.Window { Title="SimpleWPFProgra......
  • 【校园网网络维修】福禄克FLUKECIQ100网络测试指南FLUKE Network 电缆测试仪/网络测试
    FLUKECIQ100网络测试——网络测线下方指针转到discover模式,检测交换机并显示连接设置(速度/双工/线对)大的带显示器的在宿舍接墙线使用小的适配器在机房接另一端RJ45水晶头使用产品参数介绍:在宿舍区校园网的使用情境下,我们一般只介绍discover模式的使用相关介绍:  ......
  • 深度学习之AlexNet、VGG-19、VGG-16、LeNet-5、ResNet模型的训练
    一.AlexNet1.1.导入资源包importcv2importmatplotlib.pyplotaspltimportnumpyasnpimportosimportrandom注:cv2:这是OpenCV模块,用于处理图像和视频,包括摄像头捕捉、图像处理、特征检测等。matplotlib.pyplotasplt:这是Matplotlib模块的一部分,用于创建和......
  • Learning Latent Permutations with Gumbel-Sinkhorn Networks
    目录概SinkHornoperatorMeanG.E.,BelangerD.,LindermanC.andSnoekJ.Learninglatentpermutationswithgumbel-sinkhornnetworks.ICLR,2018.概本文提出了一种自动学习permutations的方法.SinkHornoperatorSinkHornoperator的操作流程如下:\[S^{0}(......