详解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# 深克隆与浅克隆的详细内容,更多关于c# 深克隆与浅克隆的资料请关注我们其它相关文章!

(0)

相关推荐

  • 浅析C#的复制和克隆

    本文浅析了C#的复制和克隆技术,对于有需要的朋友可以参考下. 在C#中,用HashTable,DataTable等实现复制和克隆,下面直接看例子: HashTable ht = null; ht = new HashTable(); foreach(string s in ht) { //... } //上面遍历的时候需要修改HashTable中的键值,一般会报异常,提示您的集合已修改XXX什么的,因为foreach遍历的时候,in 后面的集合不可更改 //这个时候应该我想到了,应该在便利之前复

  • C# List引用类型克隆的3种方法

    前言 有时候我们想克隆一个List去做别的事,而不影响原来的List,我们直接在list后面加上小点点,发现并没有Clone这样的扩展函数.这时候就只有自己扩展了. 尝试了三种方式,测试都通过了,至于性能方面我还没有做测试. 下面话不多说了,来一起看看详细的介绍吧 一.反射 public static List<T> Clone<T>(this List<T> list) where T : new() { List<T> items = new List&

  • 详解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.me

  • Java编程实现对象克隆(复制)代码详解

    克隆,想必大家都有耳闻,世界上第一只克隆羊多莉就是利用细胞核移植技术将哺乳动物的成年体细胞培育出新个体,甚为神奇.其实在Java中也存在克隆的概念,即实现对象的复制. 本文将尝试介绍一些关于Java中的克隆和一些深入的问题,希望可以帮助大家更好地了解克隆. 假如说你想复制一个简单变量.很简单: int apples = 5; int pears = apples; 不仅仅是int类型,其它七种原始数据类型(boolean,char,byte,short,float,double.long)同样适

  • 详解 c# 克隆

    克隆方法是原型设计模式中必须使用的方式,它将返回一个与当前对象数据一致的对象.正如其名,犹如一个模子雕刻而出.克隆类型分为两种:浅克隆.深克隆. 1.浅克隆 浅克隆方式是最简单.最直接的方式.只需要类实现接口ICloneable(在命名空间System.Runtime.InteropServices下)的Clone方法,在方法中使用加入对当前类的MemberwiseClone()方法即可.在浅克隆中,如果原型对象的成员变量是值类型,将复制一份给克隆对象:如果原型对象的成员变量是引用类型,则将引用

  • JavaScript数组及非数组对象的深浅克隆详解原理

    目录 什么是浅克隆.深克隆 1.对数组进行克隆 1.1 浅克隆 1.2 深克隆 2.对非数组对象进行克隆 2.1 浅克隆 2.2 深克隆 3.整合深克隆函数 什么是浅克隆.深克隆 浅克隆:直接将存储在栈中的值赋值给对应变量,如果是基本数据类型,则直接赋值对应的值,如果是引用类型,则赋值的是地址. 深克隆:将数据赋值给对应的变量,从而产生一个与源数据不相干的新数据(数据地址已变化).即对象各个层级的属性. JavaScript中基本数据类型使用符号"="可以进行克隆,引用数据类型使用符号

  • Java设计模式之原型设计示例详解

    目录 简单说一下(定义) 稍微夸一下(优缺点) 顺便提一下(适用场景) 着重讲一下(深.浅克隆) 多多用一下(结构.代码实现) 简单说一下(定义) 什么是原型模式:原型模式是用于创建重复的对象,同时又能保证性能.用一个已经创建的实例作为原型,通过复制该原型对象来创建一个或者多个和原型相同或者相似的新对象 举例说明:我们都玩过打飞机的游戏,敌军的飞机可谓是数不胜数,但是如果每出一架敌机都要重新实例化的话,那么自然我们的功能很复杂.所以这个时候我们的原型模式就派上用场了,只实例化一架飞机出来,其他的

  • Go设计模式原型模式考查点及使用详解

    目录 前言 什么是原型模式 使用原型模式的目的 使用场景 利用原型模式实现文档树 总结 前言 如果一个类的有非常多的属性,层级还很深.每次构造起来,不管是直接构造还是用建造者模式,都要对太多属性进行复制,那么有没有一种好的方式让我们创建太的时候使用体验更好一点呢? 今天的文章里就给大家介绍一种设计模式,来解决这个问题. 这篇内容要说的是创造型设计模式里的原型模式,如果写过点 JS 代码的话,大家可能听说过原型链这么个东西,原型模式在 JavaScript 实现里确实广泛应用,它那个面向对象跟 J

  • js对象实例详解(JavaScript对象深度剖析,深度理解js对象)

    这算是酝酿很久的一篇文章了. JavaScript作为一个基于对象(没有类的概念)的语言,从入门到精通到放弃一直会被对象这个问题围绕. 平时发的文章基本都是开发中遇到的问题和对最佳解决方案的探讨,终于忍不住要写一篇基础概念类的文章了. 本文探讨以下问题,在座的朋友各取所需,欢迎批评指正: 1.创建对象 2.__proto__与prototype 3.继承与原型链 4.对象的深度克隆 5.一些Object的方法与需要注意的点 6.ES6新增特性 下面反复提到实例对象和原型对象,通过构造函数 new

  • 详解jvm对象的创建和分配

    对象的创建 创建方式 1. new 关键字直接创建. new ObjectName(). 2.通过 Class 反射对象的 newInstance() 方法.ObjectName  obj  =  ObjectName.class.newInstance(). 3.通过 Class 反射对象获取 Constructor 类,再调用其 newInstance() 方法. ObjectName obj = ObjectName.class.getConstructor.newInstance().

  • AngularJS 日期格式化详解

    AngularJS是为了克服HTML在构建应用上的不足而设计的.HTML是一门很好的为静态文本展示设计的声明式语言,但要构建WEB应用的话它就显得乏力了.所以我做了一些工作(你也可以觉得是小花招)来让浏览器做我想要的事. AngularJS的日期格式化有两种形式,一种是在HTML页面,一种是在JS代码里,都是用到AngularJS的过滤器$filter. HTML: date_expression 即 你在$scope中设的date类型变量(注意,一定是date object才正确), 也是要显

  • spring boot的maven配置依赖详解

    本文介绍了spring boot的maven配置依赖详解,分享给大家,具体如下: 我们通过引用spring-boot-starter-parent,添加spring-boot-starter-web 可以实现web项目的功能,当然不使用spring-boot-start-web,通过自己添加的依赖包也可以实现,但是需要一个个添加,费时费力,而且可能产生版本依赖冲突.我们来看下springboot的依赖配置: 利用pom的继承,一处声明,处处使用.在最顶级的spring-boot-dependen

随机推荐