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之美》的所读;

浙公网安备 33010602011771号