详解c# 深克隆与浅克隆

作者:团队buff工具人 时间:2023-09-06 18:00:07 

前言

我们都知道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);
}

来源:https://www.cnblogs.com/aoximin/p/13195596.html

标签:c#,深克隆,浅克隆
0
投稿

猜你喜欢

  • Android实现带指示点的自动轮播无限循环效果

    2021-12-09 19:22:44
  • 深入java垃圾回收的详解

    2021-11-19 10:33:06
  • Spring boot如何配置请求的入参和出参json数据格式

    2023-10-23 17:27:48
  • c++指针使用形参改变实参的方法

    2023-03-11 22:40:21
  • Android Studio利用AChartEngine制作饼图的方法

    2021-12-28 10:53:30
  • Java之Algorithm_analysis案例详解

    2022-03-07 01:34:50
  • 带你一文了解C#中的Expression

    2023-04-20 04:37:57
  • 深入理解SpringMVC中央调度器DispatcherServlet

    2023-03-11 08:54:48
  • Android编程实现加载等待ProgressDialog的方法

    2022-09-11 21:12:11
  • java线程池参数位置导致的夺命故障宿主机打不开

    2021-09-29 23:27:34
  • idea2019导入maven项目中的某些问题及解决方法

    2022-10-13 12:30:53
  • Java线程中的常见方法(start方法和run方法)

    2023-11-16 17:41:32
  • 为Android的apk应用程序文件加壳以防止反编译的教程

    2023-10-23 23:49:10
  • Android使用元数据实现配置信息的传递方法详细介绍

    2023-11-02 15:25:48
  • java实现打砖块小游戏

    2021-07-26 14:47:11
  • C/C++与Java各数据类型所占字节数的详细比较

    2022-09-08 11:39:55
  • C# 异步多线程入门基础

    2022-01-19 05:23:05
  • bs架构和cs架构的区别_动力节点Java学院整理

    2021-09-18 22:06:18
  • C#验证身份证号码正确性的实例代码(收藏)

    2023-12-18 17:28:33
  • 浅谈关于Java的GC垃圾回收器的一些基本概念

    2021-11-14 10:42:52
  • asp之家 软件编程 m.aspxhome.com