C#深拷贝(复制)与浅(复制)

摘要:
返回者;}}ClassProgram{staticvoidMain{//初始化个人实例Personp1=newPerson{Id=1,Name=“Zhang San”,Age=20};人员2=p1;//浅拷贝p2.Id=2;P2.名称=“Li Si”;Personp3=p1.Clone();//深度复制p3.Id=3;P3.Name=“King Five”;Console.WriteLine;}}输出:还有几种方法可以实现深度复制:1.创建一个新对象,将属性值分配给新对象的属性值,例如,添加一个学生类,同时创建Session实例和student实例,将prestation的name属性分配给学生的名称,然后更改学生的名称值;2.反射3.表达式目录树4.序列化到此结束,我不会实现其他类型。我会在有时间的时候再次实施。

简单来介绍一下C#深浅拷贝问题

浅拷贝:复制其另一个对象的引用(在堆中使用的是同一个对象的引用);

深拷贝:而逐一复制被复制对象的数据成员的方式称为深复制(在堆中创建新的一块内存空间,使用的不是同一个对象的引用)

创建一个Person类:

 public class Person
 {
        public int Id { get; set; }    //值类型
        public string Name { get; set; }  //引用类型
        public int Age { get; set; }

 }

 浅拷贝(复制):p2改变,p1也跟着改变,使用的同一个引用对象persion

 class Program
    {
        static void Main(string[] args)
        {
            //初始化一个persion实例
            Person p1 = new Person { Id = 1, Name = "张三", Age = 20 };

            Person p2 = p1; //浅拷贝
            p2.Id = 2;
            p2.Name = "李四";

            Console.WriteLine($"p1的编号{p1.Id},p1的名字{p1.Name}; p2的编号{p2.Id},p2的名字{p2.Name}" );
        }
    }

输出:

C#深拷贝(复制)与浅(复制)第1张

深拷贝(复制):

C#中Object类提供了一个MemberwiseClone方法实现的就是上述机制。

MemberwiseClone(): 创建当前对象的浅拷贝(用来实现浅拷贝的);

实现深拷贝C# 提供一个ICloneable接口,实现Clone方法来实现深拷贝

public class Person:ICloneable
{
        public int Id { get; set; }    //值类型
        public string Name { get; set; }  //引用类型
        public int Age { get; set; }

        public object Clone()
        {
            Person person = (Person)this.MemberwiseClone(); //创建当前对象的浅拷贝。
            return person;
        }
}
class Program
{
        static void Main(string[] args)
        {
            //初始化一个persion实例
            Person p1 = new Person { Id = 1, Name = "张三", Age = 20 };

            Person p2 = p1; //浅拷贝
            p2.Id = 2;
            p2.Name = "李四";

            Person p3 = (Person)p1.Clone(); //深拷贝
            p3.Id = 3;
            p3.Name = "王五";

            Console.WriteLine($"p1的编号{p1.Id},p1的名字{p1.Name}; p2的编号{p2.Id},p2的名字{p2.Name};  p3的编号{p3.Id},p3的名字{p3.Name}" );
        }
}

输出:

C#深拷贝(复制)与浅(复制)第2张

实现深拷贝的方式还有以下几种:

1.创建一个新的对象,把属性值赋值给新对象的属性值,例如再添加一个Student的类,同时创建Persion实例和Student实例,把presion的name属性赋值给student的name,再改变student的name值(和上面方法的原理是一样的:都是两个实例);

2.反射

3.表达式目录树

4.序列化

就到这里,其他几种我就不再实现,有时间再一一实现。

免责声明:文章转载自《C#深拷贝(复制)与浅(复制)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇c#中的委托和事件Vue一些基本操作技巧下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

html2canvas踩坑日记

在html2canvas<html2canvas(document.querySelector(“#capture”)).then(canvas=>{document.body.appendChild(canvas)});//图片地址是文档。身体appendChild(画布);...

Oracle 12c新特性(For DBA)

2: Oracle12cIn-MemoryOracle12cIn-Memory提供了一种独特的双格式体系结构,它可以使用传统的行格式和新的内存列格式同时在内存中存储表。与其他NOSQL分片结构相比,OracleSharding提供了优异的运行时性能和更简单的生命周期管理。OracleSharding使用GDS体系结构自动部署和管理分片和复制技术。GDS还提供...

Selenium操作示例——鼠标悬停显示二级菜单,再点击二级菜单或下拉列表

这两天在python中玩selenium时,我遇到了一个问题,那就是鼠标移动到页面上的一个按钮或菜单,二级菜单或下拉菜单自动弹出,然后二级菜单或者下拉列表自动点击。...

easyexcel导出两种方式response返回文件流下载和保存到服务器返回下载链接

1、response方式返回excel文件流@GetMapping("/exportExcel")publicvoidexportExcel(@RequestParam(value="menu")Stringmenu,@RequestParam(value="dwflglId")intdwflglId,@RequestParam(value="qjCode"...

【译】颜色空间 REC.709 vs sRGB的

但转换函数(gamma)不同。让我们先定义颜色空间。颜色模型和颜色空间非常混乱。RGB颜色模型表示所有颜色都可以通过RGB的线性组合获得,而颜色空间是指能够解析数值的颜色模型。颜色空间的定义包含以下信息。颜色空间可以基于RGB模型检测颜色,因此使用三原色来表示所有颜色似乎是合理的。三原色的颜色坐标与sRGB相同。...

64/32位oracle客户端安装配置详细教程

如何连接远程oracle数据库?.点击完成,正式安装产品…如何实验安装是否可用?...