详解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