C#类型基础之“对象判等”、“对象复制”、“不可变类型”

对象判等分为以下两种类型的判等:

  1、引用类型判等

    引用类型判等主要有三个方法,实例的Equals(object obj),静态的Equals(object objA,object objB),静态的ReferenceEquals(object objA,object objB);他们所判断的都是两个变量是否指向堆上的同一个对象;

  2、值类型判等

    (1)简单值类型(值类型中只包含值类型)

      简单值类型的判等直接按位比较;CanCompareBits()

    (2)复杂值类型(值类型中包含引用类型)

      复杂值类型判等通过反射获取变量中的所有字段,进行依次比较;值类型按位比较,引用类型则调用引用类型的实例方法Equals(object obj)进行引用判等;复杂值类型会存在一个递归调用方法的问题;

 

对象复制分为以下两种:

  1、浅复制(复制堆栈上的数据,堆上的数据只有一份)

    (1)值类型隐式的实现了浅复制,只需要直接赋值就行了

    (2)引用类型只需要实现ICloneable接口,在接口的Clone()中调用MeberwiseClone()即可;

  2、深复制

    (1)类型要实现深度复制,简单方法就是通过序列化后再反序列化回去;BinaryFormatter,MemoryStream;

    (2)简单值类型直接赋值即可实现深度复制,内置引用类型调用Copy方法;

不可变类型

  实现不可变类型需要满足以下三个条件:

  1、对象的原子性(构造函数内对所有字段进行赋值)

  2、对象的常量性(取消属性的set访问器,字段修改为readonly)

  3、避免外部类型对类型内部的修改(字段赋值前进行深度复制再赋值,get访问器返回字段数据时也执行一个深度复制后再返回)

 

ps:以上总结来源于《.Net之美》的所读;

posted @ 2019-07-18 09:43  听雨停了  阅读(244)  评论(0)    收藏  举报