• C#_深拷贝与浅拷贝


      1 using System;
      2 using System.Collections.Generic;
      3 using System.IO;
      4 using System.Linq;
      5 using System.Runtime.Serialization.Formatters.Binary;
      6 using System.Text;
      7 using System.Threading.Tasks;
      8 
      9 namespace _004深拷贝浅靠背
     10 {
     11     class Program
     12     {
     13         static void Main(string[] args)
     14         {
     15 
     16             Student s1 = new Student() { Id="123",Name="Joe",Age=16};
     17             //Student s2 = s1;    //没有发生拷贝  对象只有一个   只是将引用赋值给了 s2
     18 
     19 
     20 
     21             //Student s2 = new Student();
     22             //s2.Age = s1.Age;
     23             //s2.Id = s1.Id;
     24             //s2.Name = s1.Name;
     25             //以上才叫发生了拷贝
     26 
     27 
     28 
     29             //拷贝 一般通过  序列化  来完成拷贝
     30             Student s2=new Student();
     31             BinaryFormatter bf = new BinaryFormatter();
     32             //这里使用的是 内存流  
     33             byte[] bs = new byte[1000];
     34             //定义一个内存流  并且将对象序列化到内存中
     35             using(MemoryStream ms =new MemoryStream(bs))
     36             {
     37                 //将对象s1 序列化到内存当中去了
     38                 bf.Serialize(ms, s1);
     39             }
     40             //然后再将这个流反序列化回来
     41             using (MemoryStream ms = new MemoryStream(bs))
     42             {
     43                 s2 = bf.Deserialize(ms) as Student;
     44             }
     45             Console.WriteLine(s2.Name + "  "+ s2.Id + "  <s2>  "+ s2.Age);
     46 
     47 
     48 
     49 
     50             s1.Tea = new Teacher() { Name="Zhao"};
     51 
     52             Student s3 = new Student();
     53             s3.Id = s1.Id;
     54             s3.Age = s1.Age;
     55             s3.Name = s1.Name;
     56             s3.Tea = s1.Tea;//浅拷贝   将引用类型的对象直接指向 s3.Tea    没有创建新对象   赋值的是 对象的引用
     57 
     58             Student s4 = new Student();
     59             s4.Id = s1.Id;
     60             s4.Name = s1.Name;
     61             s4.Age = s1.Age;
     62 
     63             s4.Tea = new Teacher();      //深拷贝  将引用类型 重新new了   创建新对象   将原对象的值赋值过去
     64             s4.Tea.Name = s1.Tea.Name;
     65 
     66 
     67         }
     68     }
     69 
     70 
     71     /// <summary>
     72     /// 如果要做拷贝的话 尽量不要在类中定义自动属性
     73     /// </summary>
     74     /// 
     75     [Serializable]
     76     class Student
     77     {
     78         private string _id;
     79 
     80         public string Id
     81         {
     82             get { return _id; }
     83             set { _id = value; }
     84         }
     85 
     86         private string _name;
     87 
     88         public string Name
     89         {
     90             get { return _name; }
     91             set { _name = value; }
     92         }
     93 
     94         private int _age;
     95 
     96         public int Age
     97         {
     98             get { return _age; }
     99             set { _age = value; }
    100         }
    101 
    102         //自定义类型
    103         private Teacher _tea;
    104         internal Teacher Tea
    105         {
    106             get { return _tea; }
    107             set { _tea = value; }
    108         }
    109 
    110     }
    111 
    112     [Serializable]
    113     class Teacher
    114     {
    115         private string _name;
    116 
    117         public string Name
    118         {
    119             get { return _name; }
    120             set { _name = value; }
    121         }
    122     }
    123 
    124 
    125 
    126 
    127 }
  • 相关阅读:
    Coursera 高级数据结构与算法,北京大学
    heap 算法函数
    笛卡尔树 Cartesian tree
    POJ 1830 开关问题 异或高斯消元
    jmeterJSR223取样器和断言
    Flask JinJa2模板语法测试
    Python Flask Web 试题汇编<待续>
    jsDoc自动生成文档
    SQL 优化
    IO多路复用之select、poll、epoll的区别
  • 原文地址:https://www.cnblogs.com/siyi/p/5016795.html
Copyright © 2020-2023  润新知