考虑在处理类和结构的实例时,“相等”意味着什么?
1.比较引用类型的相等性
有四种不同的方法来比较对象的想等性
// -------- 比较引用类型的相等性 -------- // // ------- 有四种不同的方法来比较对象的想等性 ----- object obj1 = new object(); object obj2 = obj1;//new object(); //静态方法,测试两个引用是否引用类的同一个实例,判断的是内存中的相同地址 object.ReferenceEquals(obj1, obj2); //false object.ReferenceEquals(null, null); //true object.ReferenceEquals(obj1, obj1); //true //object基类中的虚方法,与ReferenceEquals版本的实现相同,比较的是的内存地址 //因为是虚方法,所以在派生类对象中可以进行重写,按对象值进行比较 //重写方法时,不能抛出异常 obj1.Equals(obj2); //静态方法 //如果两个参数都为null,则返回true //如果两个参数,其中一个为null,则返回false //如果两个参数都不为null,则调用上面虚拟版本的Equals(obj)方法 object.Equals(obj1,obj2); //比较运算符 == // == 默认进行的也是内存地址比较 // string 类重写了 == 运算符,string 进行的是值比较 if (obj1 == obj2) { }
比较值类型的相等性
比较引用类型的四种方法,也可以用来比较值类型,但有部分区别
// object.ReferenceEquals(obj1, obj2) 用于比较引用,即内存地址,但是值类型需要装箱,所以结果永远false。 // Equals 用于比较值, 结构体的Equals会对每个字段值进行比较 // 如果值类型的某个字段是引用类型,则最好重写Equals,因为引用类型默认比较内存地址
比较 Equals()、ReferenceEquals()、==