服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - 详解c# 深克隆与浅克隆

详解c# 深克隆与浅克隆

2022-09-23 15:22团队buff工具人 C#

这篇文章主要介绍了c# 深克隆与浅克隆的相关资料,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下

前言

我们都知道memberwiseclone 会将浅克隆。

什么是浅克隆?如何深克隆呢?

正文

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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;
}

测试:

?
1
2
3
4
5
6
7
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的引用给了新的克隆对象。

那么如何深克隆呢?

深克隆其实就是将对象序列化,也就是说要深克隆的话必须对象系列化;

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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 类。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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;
}

测试一下:

?
1
2
3
4
5
6
7
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# 深克隆与浅克隆的资料请关注服务器之家其它相关文章!

原文链接:https://www.cnblogs.com/aoximin/p/13195596.html

延伸 · 阅读

精彩推荐
  • C#c#将字节数组转成易读的字符串的实现

    c#将字节数组转成易读的字符串的实现

    这篇文章主要介绍了c#将字节数组转成易读的字符串的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的...

    森大科技4922022-08-17
  • C#如何使用C#程序给PDF文件添加编辑域

    如何使用C#程序给PDF文件添加编辑域

    本文主要给大家分享的是通过C#操作PDF类库iTextSharp来实现在在PDF文档中填写日期或签名之类的能编辑的文本域,非常的简单实用,有需要的小伙伴可以参考...

    冯威9332021-12-18
  • C#C#多线程之Thread类详解

    C#多线程之Thread类详解

    这篇文章主要为大家详细介绍了C#多线程之Thread类,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    云梦鸿4122022-01-19
  • C#Unity3D在Preview中打印日志的方法

    Unity3D在Preview中打印日志的方法

    这篇文章主要为大家详细介绍了Unity3D在Preview中打印日志的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    UnityAsk9342022-08-05
  • C#C#无损转换Image为Icon的方法

    C#无损转换Image为Icon的方法

    这篇文章主要为大家详细介绍了C#无损转换Image为Icon的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    AhDung5172021-12-30
  • C#浅谈C#中List<T>对象的深度拷贝问题

    浅谈C#中List<T>对象的深度拷贝问题

    下面小编就为大家带来一篇浅谈C#中List<T>对象的深度拷贝问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    C#教程网11612021-04-28
  • C#c# 计算时间间隔的简单方法(推荐)

    c# 计算时间间隔的简单方法(推荐)

    下面小编就为大家带来一篇c# 计算时间间隔的简单方法(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    C#教程网8892021-12-03
  • C#基于C#生成条形码操作知识汇总附源码下载

    基于C#生成条形码操作知识汇总附源码下载

    这篇文章主要介绍了基于C#生成条形码操作知识汇总的相关资料,需要的朋友可以参考下...

    polk611762021-11-08