彭麒的号

导航

面试大法

  • C# 当中的深拷贝和浅拷贝

    • 浅拷贝:引用类型的浅拷贝只是拷贝对象的引用地址,而不对其值进行拷贝。拷贝后的两个对象的区别是,当修改拷贝后的对象的值被拷贝的那个对象的值也会发生改变,因为他们指向的都是同一个引用地址。C# 的 基类对象Object实现了一个浅拷贝的方法 MemberwiseClone()

      public class myclass
      {
        public class1 c1 = new class1();
        
        public string Name{get;set;}
        
        public string Age {get;set;}
        
        //浅克隆对象:浅拷贝的复制对象 共享原始对象的引用类型成员对象  这里指的共享 class1 
        public new object GetMemberwiseClone()=>base.MemberwiseClone();
        
      }
      public class class1
      {
        public string NickName get;set;}
      }
      
      
      static void Main(string[] args)
      {
        myclass mc = new myclass();
        myclass cloneMc = (myclass)mc.tMemberwiseClone();
        cloneMc.c1.NickName = "彭麒";  //这里的赋值将影响原始对象 mc 的 用类型成员对象class1 的 NickName 属性
      }
      
    • 深拷贝:引用类型的深拷贝其实是拷贝的对象的值,拷贝对象的引用地址和源对象的引用地址不一致。这样就实现了互不影响的效果。在值类型当中,只有深拷贝,因为值类型复制后不会影响另一个值类型。

      int a=12;
      int c=a;//进行了深拷贝
      c=232 //不影响
      
      • 对于需要实现深拷贝的做法一般是我们自己去实现ICloneable接口。一下就是实现克隆的方法:
      public class myclass:ICloneable
      {
        public class1 c1 = new class1();
        
        public string Name{get;set;}
        
        public string Age {get;set;}
        
        //浅克隆对象:浅拷贝的复制对象 共享原始对象的引用类型成员对象  这里指的共享 class1 
        public new object GetMemberwiseClone()=>base.MemberwiseClone();
        
        
        public object Clone()
        {
          //重新创建一个新的对象
          myclass newMc = new myclass();
          //给新的对象重新分配一个新的引用
          newMc.c1 = new class1();
          // 对象属性进行复制
          newMc.c1.NickName = c1.NickName;
          
          //对象属性进行复制
           newMc.c1.Name = c1.Name;
           //对象属性进行复制
           newMc.c1.Age = c1.Name;
          
          return newMc;
        }
      }
      
      
      public class class1
      {
        public string NickName get;set;}
      }
      
      
      static void Main(string[] args)
      {
        //浅拷贝
        myclass mc = new myclass();
        myclass cloneMc = (myclass)mc.GetMemberwiseClone();
        cloneMc.c1.NickName = "彭麒";  //这里的赋值将影响原始对象 mc 的 用类型成员对象class1 的 NickName 属性
        
        //深拷贝
        myclass mc1 = new myclass();
        myclass cloneMc1 = (myclass)mc.Clone();
        cloneMc.c1.NickName = "彭麒";  //这里的赋值不会影响原始对象 mc1 的任何状态。
        
      }
      
      
      • 另外深克隆的其他方式还可以是通过序列化与反序列化来实现。
  • C# ReadOnly 和 Static 的区别

  • C# 所有类型的基类

  • C# Object对象的方法

  • Oracle 查询语句耗时过长怎么优化

  • Oracle 表字段为varchar2类型,当表中有千万级别的数据怎么把字段改为Date类型

  • C# 重构的方式

  • C# 委托和事件

posted on 2022-07-20 16:17  彭麒的号  阅读(27)  评论(0编辑  收藏  举报