zoukankan      html  css  js  c++  java
  • 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);
    }
    
  • 相关阅读:
    496. 下一个更大元素 I
    20200516文献速递
    20200510文献速递
    beta,or, p value计算zscore
    20200503文献速递
    古人以及其他灵长类动物基因组数据
    20200420-0426文献速递
    使用snpflip校正基因组正负链
    使用qqman对曼哈顿图(Manhattan plot )多个显著位点标志不同颜色,拒绝屎一样的绿色
    RAEdb:基于STARR-seq和MPRA数据的enhancers和Epromoters可视化
  • 原文地址:https://www.cnblogs.com/aoximin/p/13195596.html
Copyright © 2011-2022 走看看