C# 对象的深复制和浅复制
2019年第一篇博客,好吧,又大了一岁了,继续加油吧。
正文:
C# 中的对象,众所周知是引用类型,那么如何复制对象Object呢,我们来看看下面这段代码:
public class User
{
public int UserId { get; set; } public string UserName { get; set; } public string PassWord { get; set; } public DateTime AddTime { get; set; } public User(int UserId, string UserName, string PassWord, DateTime AddTime)
{
this.UserId = UserId;
this.UserName = UserName;
this.PassWord = PassWord;
this.AddTime = AddTime;
}
} public class People
{
public string abc { get; set; }
public User User { get; set; } public People ShallowCopy()
{
return (People) this.MemberwiseClone();
} public People DeepCopy()
{
People other = (People)this.MemberwiseClone();
other.User = new User(User.UserId, User.UserName, User.PassWord, User.AddTime); other.abc = String.Copy(abc);
return other;
}
}
People people = new People
{
abc = "",
User = new User(,"","",DateTime.Now)
};
People people4 = people;
people.abc = "";
people.User.PassWord = "";
我们可以看到 将对象people 赋给了people4,那么我们修改people的值 people4 的值会如何呢?我们打断点试试,

我们可以看到people 和people4的值是一样的,什么原理呢,原来people4只是people的引用,people4指向people的地址,所以people的值改变,实际上people4引用的值就是people的地址,所以他们的值是一样的。
那么都是一样的话,我们需要怎么才能复制对象,而不是引用呢,
可以看到上面的代码中people类中定义了两个方法 ShallowCopy() 和 DeepCopy(),那这两个方法有什么作用呢,首先我们来看下面这段代码:
People people = new People
{
abc = "",
User = new User(,"","",DateTime.Now)
};
People people2 = people.ShallowCopy(); //浅拷贝方法
People people3 = people.DeepCopy(); //深拷贝方法
people.abc = "";
people.User.PassWord = "";
那这里 people2 和people3 的值是什么呢,打断点看看:
我们可以看到的是,people的值改变之后,people2中abc的值并没有改变,但是people2中User 中的password的值已经改变了,这就是对象的浅拷贝,是因为浅拷贝对象people2中的object类型指向的地址还是people的地址。
而people3 是深拷贝,深复制了一个新的对象,地址和原对象people不同,所以people的值改变,people3的值不会变。
这就是深拷贝和浅拷贝的区别。That's all, thank you
C# 对象的深复制和浅复制的更多相关文章
- php对象当参数传递 && php深复制和浅复制
把对象当参数传递给方法,在方法里改过对象后,影响到外面的对象 因为对象是引用传递过去的 class Book { public $name; public function __construct( ...
- Java中对象的深复制和浅复制详解
1.浅复制与深复制概念 ⑴浅复制(浅克隆) 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象. ⑵ ...
- C++学习基础七——深复制与浅复制
一.深复制与浅复制基本知识 深复制和浅复制,又称为深拷贝和浅拷贝. 深复制和浅复制的区别如下图1所示: 图1 图1表示的是,定义一个类CDemo,包含int a和char *str两个成员变量, 当深 ...
- iOS中的深复制与浅复制
很多语言中都有深复制浅复制的概念,如C++,ObjC等.简单来说,浅复制就是两个变量指向了同一块内存区域,深复制就是两个变量指向了不同的内存区域,但是两个内存区域里面的内容是一样的. 浅复制示意图: ...
- iOS 集合的深复制与浅复制
概念 对象拷贝有两种方式:浅复制和深复制.顾名思义,浅复制,并不拷贝对象本身,仅仅是拷贝指向对象的指针:深复制是直接拷贝整个对象内存到另一块内存中. 一图以蔽之 再简单些说:浅复制就是指针拷贝:深复制 ...
- Java中的深复制与浅复制
1.浅复制与深复制概念 ⑴浅复制(浅克隆) 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅复制仅仅复制所考虑的对象,而不 复制它所引用的对象. ...
- C#深复制和浅复制
本文在于巩固基础 我们来看看什么是深复制.浅复制: C#中对于数据的复制机制虽然简单但是容易让人误解.C#数据类型大体分为值类型(value type)与引用类型(reference type).对于 ...
- C#深复制与浅复制
C#深复制与浅复制 C#中对于数据的复制机制虽然简单但是容易让人误解.C#数据类型大体分为值类型(value type)与引用类型(reference type).对于值类型数据,复制的时候直接将数据 ...
- clone()方法、深复制和浅复制
clone方法 Java中没有明确提供指针的概念和用法,而实质上没个new语句返回的都是一个指针的引用,只不过在大部分情况下开发人员不需要关心如何去操作这个指针而已. 在实际编程中,经常会遇到从某个已 ...
- iOS 之 深复制、浅复制
深复制不仅复制对象本身,对象持有的属性对象也做了复制. 浅复制之复制对象本身,不对里面的属性进行复制.
随机推荐
- Office - InfoPath
1. 移除隐藏空间后剩余的空白: http://social.technet.microsoft.com/Forums/sharepoint/zh-TW/3dea3014-f808-428b-b283 ...
- css层叠性和继承性
1.了解css层叠性 层叠性是什么?就是解决处理css选择器和属性冲突的能力.css的选择器权重是分大小,就是当多个选择器都选中了同一个标签时,听谁的??? 标签选择器 < 类选择器 < ...
- CRM系统知识点之一权限(RBAC)
一个项目可以有多个应用 一个做成组件 一个做逻辑判断一个应用(做成组件形式)可以服务于多个项目 rbac权限(role-base access control)who what how什么样的角色对什 ...
- 搭建git远程仓库
基于本地协议搭建git远程仓库 1.任意目录下执行git init -bare创建裸仓库,建议目录名称以.git结尾 2.共享此目录,windows下右键裸仓库目录,切换到共享面板设置完成即可获取共享 ...
- GitHub教程(二) 删除已有仓库
通过GitHub教程(一)的阅读,我相信您对GitHub体系框架已经有了模模糊糊的了解.本节教程将继续介绍GitHub的操作---删除仓库. 作为GitHub的入门使用者,我们可能会建一些简单的仓库来 ...
- PHP and laravel知识点小小积累
function () use ($x, &$y){} 自从PHP5.3开始有了closure/匿名函数的概念,在这里的use关键词的作用是允许匿名函数capture到父函数scope 内存在 ...
- 前后端分离, 前端如何防止直接输入URL进入页面?
转自:https://blog.csdn.net/weixin_41829196/article/details/80444870 前后端分离,如何防止用户直接在地址栏输入url进入页面,也就是判断用 ...
- win10下Java环境配置
JAVA_HOME : E:\ensoft\jdk(这个是jdk安装路径) CLASSPATH : .;E:\ensoft\jdk\lib;E:\ensoft\jdk\lib\dt.jar;E:\en ...
- ssh免密码登陆失败的原因
今天因为需要在两台服务器上进行ssh免登陆,所以安装网上的教程,ssh-keygen -t rsa,然后把相互的密钥加入到对方的authorized_keys. 问题是我们虽然这样做了,却一直要密码, ...
- 四、HTTP和HTTPS的区别
1:简介 超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息.HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可 ...