首页 > 其他分享 >14_深拷贝

14_深拷贝

时间:2024-03-04 23:22:22浏览次数:19  
标签:克隆 clone Person Street Address 拷贝 public 14

深拷贝

深拷贝是一种克隆类型,其中原始对象的所有字段和属性都会被复制到克隆中,包括嵌套对象。这意味着对克隆的任何更改都不会影响原始对象。

ICloneable 接口

ICloneable 接口允许 .NET 对象创建自身的一个副本,称为克隆。克隆与原始对象具有相同的值,但它们是独立的对象。

实现 ICloneable

要实现深拷贝,可以实现 ICloneable 接口并覆盖其 Clone 方法。在 Clone 方法中,您需要手动复制原始对象的所有字段和属性。

代码示例

以下是一个简单的代码示例,演示如何使用 ICloneable 实现深拷贝:

public class Person : ICloneable
{
    public string Name { get; set; }
    public int Age { get; set; }
    public Address Address { get; set; }

    public object Clone()
    {
        // 创建一个新对象作为克隆
        Person clone = new Person();

        // 复制基本类型字段
        clone.Name = this.Name;
        clone.Age = this.Age;

        // 复制引用类型属性
        clone.Address = (Address)this.Address.Clone();

        // 返回克隆
        return clone;
    }
}

public class Address : ICloneable
{
    public string Street { get; set; }
    public string City { get; set; }

    public object Clone()
    {
        // 创建一个新对象作为克隆
        Address clone = new Address();

        // 复制基本类型字段
        clone.Street = this.Street;
        clone.City = this.City;

        // 返回克隆
        return clone;
    }
}

// 使用 Person 对象
Person person1 = new Person
{
    Name = "John Doe",
    Age = 30,
    Address = new Address { Street = "123 Main Street", City = "Anytown" }
};

// 克隆 person1
Person person2 = (Person)person1.Clone();

// 修改克隆
person2.Name = "Jane Doe";
person2.Address.Street = "456 Elm Street";

// 输出结果
Console.WriteLine($"Original Person: {person1.Name}, {person1.Age}, {person1.Address.Street}, {person1.Address.City}");
Console.WriteLine($"Cloned Person: {person2.Name}, {person2.Age}, {person2.Address.Street}, {person2.Address.City}");

输出:

Original Person: John Doe, 30, 123 Main Street, Anytown
Cloned Person: Jane Doe, 30, 456 Elm Street, Anytown

标签:克隆,clone,Person,Street,Address,拷贝,public,14
From: https://www.cnblogs.com/cookie2030/p/18053000

相关文章

  • p7914-solution
    P7914Solutionlink先考虑Subtask\(4\)。设\(dp_i\)表示长度为\(i\)的方案数,按题目定义转移:AB,ASB:\(\displaystyledp_n\getsdp_n+\sum_{i=1}^{n-1}\sum_{j=0}^kdp_i\timesdp_{n-i-j}\)(A):\(\displaystyledp_n\getsdp_n+dp_{n-2}\)(SA),(AS):\(\displa......
  • 洛谷题单指南-搜索-P1443 马的遍历
    原题链接:https://www.luogu.com.cn/problem/P1443题意解读:无论是国际象棋还是中国象棋,马的活动范围都是一样的:只不过国际象棋棋子是在格子中,中国象棋棋子是在交点,坐标的变化方式是一样的,根据此活动范围,计算马到达每一个点的最短路径。解题思路:根据马的活动范围,在棋盘内进行B......
  • Oracle数据库错误:ora-28014:cannot drop administrative users(无法删除管理用户或角色
    1.问题在创建用户test之后,删除时发生错误ora-28014:cannotdropadministrativeusers2.解决由于Oracle数据库要求创建用户必须以C##开头,在创建该用户时,我们设置了altersessionset"_oracle_script"=true;Oracle数据库如何解决创建用户名开头必须要C##问题?但是删除时,由......
  • 首发锐龙9 8945HS!ROG幻14 Air评测:性能最强的14寸轻薄本
    一、前言:1.5kg就有锐龙98945HS和RTX4060独显这应该目前为止,性能最强的14寸轻薄本!它在15.9mm机身厚度和1.5kg的重量下塞入了锐龙98945HS处理器和RTX4060独显,并且整机性能释放高达100W!能做到如此的,目前也就只有ROG幻14Air这一款。ROG幻14Air首发搭载锐龙98945HS,这款处理......
  • 【个人前端笔记】手写对象深拷贝
    一、对象深拷贝简单的方法:JSON序列化方法通过将对象转换成JSON格式并转换回对象,实现深拷贝leta1={a:"hello",b:"world",c:[1,2,3],d:{a:1,b:2}}leta2=JSON.parse(JSON.stringify(a1))console.log(a2);JSON序列化拷贝的缺点a.不支持......
  • python接口自动化系列(14):一键执行生成并打开报告
     本系列汇总,请查看这里:https://www.cnblogs.com/uncleyong/p/18033074需求在前面的篇幅中,查看测试报告,我们要先运行自动化框架(执行pythonmain.py命令)生成result,然后再生成allure-report,最后再打开报告,这样稍显麻烦。有测试小伙伴就问,能不能一键执行生成并打开报告呢?当然可......
  • KY148 还是畅通工程c
    这题好像更新了呀,不压缩路径的话,find函数用递归的话会栈溢出。#include<stdio.h>#include<stdbool.h>#include<stdlib.h>intset[101];typedefstructnode{intlength;inte1;inte2;}edge;voidinit_set(int*set){for(inti=0;i<101;i++){......
  • 16 Educational Codeforces Round 142 (Rated for Div. 2)C. Min Max Sort(递归、思维
    C.MinMaxSort很不错的一道题目,不过脑电波和出题人每对上,\(qwq。\)正难则反。我们考虑最后一步是怎么操作的。最后一步一定是对\(1\)和\(n\)进行操作那么上一步呢?上一步应该是对\(2\)和\(n-1\)以此类推第一步应该是对\(\frac{n}{2}\)和\(\frac{n}{2}+1\)我们的答案应该......
  • Educational Codeforces Round 143 (Rated for Div. 2)C. Tea Tasting(前缀和+二分、
    C.TeaTasting思路这里枚举有三种思路然后经过考虑3是最可行的,然后接着考虑如何计算贡献这里在实现的时候用了一个差分数组,因为我们需要记录第i个茶师它喝了多少个\(b_i\)以及不满\(b_i\)的用\(c_i\)记录,最后计算一下答案即可。#include<bits/stdc++.h>#defineintlon......
  • 147. 对链表进行插入排序(中)
    目录题目题解优化题目给定单个链表的头head,使用插入排序对链表进行排序,并返回排序后链表的头。插入排序算法的步骤:插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在......