c# 深克隆与浅克隆
前言
我们都知道memberwiseclone 会将浅克隆。
什么是浅克隆?如何深克隆呢?
正文
public class good{
private good(){
oneclass=new class{
int id=8;
string name='id';
}
}
private static good __good;
private static good __good=new good();
public good createinstance()
{
return __good.memberwiseclone();
}
public int a=0;
public string b="ab";
pulic class oneclass;
}
测试:
void main()
{
var student1=good.createinstance();
var student2=good.createinstance();
student1.oneclass.id=9;
console.log('student2 oneclass.id{0}',student2.oneclass.id);
}
这里我们得出了结果为9;
ok,那么这真的是个匪夷所思的问题,明明两个对象啊。
那么回归到浅克隆上。
当克隆good的时候是这样的。
让good的classone的引用给了新的克隆对象。
那么如何深克隆呢?
深克隆其实就是将对象序列化,也就是说要深克隆的话必须对象系列化;
public class SerializeHelper
{
public static string Serializable(object target)
{
using (MemoryStream steam=new MemoryStream())
{
new BinaryFormatter().Serialize(steam,target);
return Convert.ToBase64String(steam.ToArray());
}
}
public static T Derializable<T>(string target)
{
byte[] targetArray = Convert.FromBase64String(target);
using (MemoryStream steam =new MemoryStream(targetArray))
{
return (T)(new BinaryFormatter().Deserialize(steam));
}
}
public static T DeepClone<T>(T t)
{
return Derializable<T>(Serializable(t));
}
}
改变一个good 类。
public class good{
private good(){
oneclass=new class{
int id=8;
string name='id';
}
}
private static good __good;
private static good __good=new good();
public good createinstance()
{
return SerializeHelper.DeepClone(__good.memberwiseclone());
}
public int a=0;
public string b="ab";
pulic class oneclass;
}
测试一下:
void main()
{
var student1=good.createinstance();
var student2=good.createinstance();
student1.oneclass.id=9;
console.log('student2 oneclass.id{0}',student2.oneclass.id);
}
c# 深克隆与浅克隆的更多相关文章
- Java克隆--深克隆与浅克隆的区别
克隆,就是复制一个对象的副本,而克隆又分浅克隆和深克隆.浅克隆是指克隆得到的对象基本类型的值改变了,而源对象的值不会变.但如果被克隆对象引用类型的值改变了,那么源对象的值同样会改变,因为引用类型在栈内 ...
- 浅谈Java中的深克隆和浅克隆(阿里面试)
在最近的秋招中,阿里和多益网络都问到了这个问题,虽然很简单,但是我还是想总结一下,感兴趣的可以看一下我的个人博客网站(Spring+MyBatis+redis+nginx+mysql)(适合菜鸟),最 ...
- Java中的深克隆和浅克隆
为什么要克隆 首先思考一个问题, 为什么需要克隆对象? 直接new一个对象不行吗? 克隆的对象可能包含一些已经修改过的属性, 而new出来的对象的属性都还是初始化时候的值, 所以当需要一个新的对象来保 ...
- 【java开发系列】—— 深克隆和浅克隆
Java支持我们对一个对象进行克隆,通常用在装饰模式和原型模式中.那么什么是深克隆,什么是浅克隆呢. [浅克隆],通常只是对克隆的实例进行复制,但里面的其他子对象,都是共用的. [深克隆],克隆的时候 ...
- JAVA深克隆与浅克隆1
复制就是得到一个副本 克隆就是复制一个对象的复本.但一个对象中可能有基本数据类型,如:int,long,float 等,也同时含有非基本数据类型如(数组,集合等)被克隆得到的对象基本类型的值修改 ...
- JavaScript的深克隆与浅克隆
JS数据类型分为两类: 基本类型(Number.Boolean.Undefined.Null.String.Symbol(ES6新加,此处不讨论))与引用类型(Object).原始类型存储的是对象的实 ...
- js深克隆与浅克隆
定义: 浅克隆: 克隆对象的一层属性, 如果对象还有对象的话,里面的对象没有进行克隆,只是把地址给了别人.也可以理解为只是简单的克隆了躯体,但是没有得到其灵魂: 深克隆:克隆对象的多层属性,对象里面还 ...
- java深克隆与浅克隆
2015.9.19 6:45 星期五 1
- java 深克隆(深拷贝)与浅克隆(拷贝)详解
java深克隆和浅克隆 基本概念 浅复制(浅克隆) 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅复制仅仅复制所拷贝的对象,而不复制它所引用的对 ...
- Java的浅克隆和深克隆
如何实现对象的克隆 (1)实现 Cloneable 接口并重写 Object 类中的 clone() 方法: (2)实现 Serializable 接口,通过对象的序列化和反序列化实现克隆,可以实现真 ...
随机推荐
- vscode 注释后 光标下移(注释后光标快速定位下一行) 仿照idea
VSCode 注释后光标快速定位下一行 1. 安装插件 Multi-command Multi-command 2.打开 Keybinding.json Keybinding.json 左下角齿轮图标 ...
- AutoNumber VsCode插件开发
AutoNumber VsCode插件开发 ::: details 目录 目录 AutoNumber VsCode插件开发 Step. 2: 安装脚手架 Step. 3: 创建空项目 Step. 4: ...
- Multi-Runtime多运行时架构
概念 Multi-Runtime Multi-Runtime 是一种服务端架构思路,把应用里的所有中间件挪到 Sidecar 里,使得"业务运行时"和"技术运行时&quo ...
- Pandas导出美化技巧,让你的Excel更出众
pandas的DataFrame可以通过设置参数使得在jupyter notebook中显示的更加美观,但是,将DataFrame的数据导出excel时,却只能以默认最朴素的方式将数据写入excel. ...
- C++ explicit 关键字简介
explicit 关键字修饰构造函数 防止类的初始化的时候进行隐式转换. class MyClass { string m_s; int m_a, m_b; public: MyClass(strin ...
- java的接口和抽象类区别
转自:深入理解Java的接口和抽象类 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在 ...
- django(图书管理系统)
一.表的设计 from django.db import models # Create your models here. class Book(models.Model): title = mod ...
- 记录--再也不用手动改package.json的版本号
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 本文的起因是有在代码仓库发包后,同事问我"为什么package.json 里的版本还是原来的,有没有更新?",这个时候 ...
- 慎用django orm的update_or_create方法
公司一个线上招聘项目,后端采用Django开发,数据库使用MySQL.最近一次线上招聘会活动,因短时间大量用户涌入,被吐槽服务响应时间过长.后端和运维人员经排查,定位到MySQL数据库有死锁 根据错误 ...
- Win10下安装Java JDK 1.8 配置环境变量
1.下载地址:https://www.oracle.com/java/technologies/javase-downloads.html 2.双击运行,下一步.下一步-- 3.新建变量名:JAVA_ ...