CompareTo,Equals(),==的区别

简介:

CompareToEquals(),==的区别

C#可以用CompareToEquals==这三种实现方式,equals()==都是object自己就带的东西,而CompareTo则是需要继承IComparable接口,最后想了想,因为不熟悉,那些系统提供的方法还是少override为妙,就选了实现IComparable接口。那有时间:参考一下MSDN:点击跳转Equals() 和运算符 == 的重写准则从这上面可以看到,C#中的相等有两种类型:引用相等(ReferenceEquals)和值相等(Equals)。值相等就是说两个对象包含相同的值两个对象包含相同的值。而引用相等则比较的是两个对象的引用是否是同一个对象。也就是说,如果ReferenceEqualsTrue,则Equals必然为True,反过来就不一定了。这样的话可以看出来,ReferenceEquals我们没有比较去管他什么,系统自动解决,object类实现的静态RefrenceEquals函数就够了。而对于自定义的类型的话,如果想要实现判断值相等,是需要重写Equals函数的。我们可以看一下string和自定义类的对比:

string strA = "Hello"; 

string strB = string.Copy(strA); Console.WriteLine(strA==strB);//True 

Console.WriteLine(strA.Equals(strB)); //True

Console.WriteLine(object.Equals(strA, strB));

//True Console.WriteLine(object.ReferenceEquals(strA, strB));//False 

class MyClass {

public int value = 1;

... MyClass oA = new MyClass(); MyClass oB = new MyClass(); 

Console.WriteLine(oA == oB);//False Console.WriteLine(oA.Equals(oB));//False Console.WriteLine(object.Equals(oA,oB));

//False Console.WriteLine(object.ReferenceEquals(oA, oB)); //False 

先不考虑==号,看几个Equals的表现,Equals是要实现值相等比较的效果的,.net 在实现string的时候就重写了Equals(object) ,并添加重载函数Equals(string) ,因此两个比较才会返回True。而不实现这两个函数的后果就是都返回False,无法符合Equals函数应有的作用。MSDNEquals函数实现的保证: Equals 的新实现应该遵循 Equals 的所有保证: x.Equals(x) 返回 true

x.Equals(y)  y.Equals(x) 返回相同的值。•如果 (x.Equals(y) && y.Equals(z)) 返回 true,则 x.Equals(z) 返回 true

只要不修改 x  y 所引用的对象,x.Equals(y) 的后续调用就返回相同的值。 x.Equals (null) 返回 false。由此看来,对于之前我的需求:比较两个自定义类的内容是否相同,还是应该重写Equals(Object),,,,并建议重载对自己的类的实现Equals(MyClass)而对于==运算符的解释为:通过判断两个引用是否指向同一对象来测试是否相等。也就是引用相等了,可对于上面对string的测试,RefrenceEqualsFalse时,==却返回的True,这是因为还有这么一条:当类型不可变类型(即实例中包含的数据不可更改)时,通过重载运算符== 来比较值是否相等而不是比较引用是否相等。(这里和java不同,java==就是用来比较引用是否相等的,而且java也不允许算符重载)。我们大部分情况下写的自定义类都是可变的,所以一般用不到也不应该对==进行重载。再来看看IComparable接口

参考MSDN:点击跳转IComparable 接口它的作用为:定义一种特定于类型的通用比较方法,值类型或类通过实现此方法对其实例进行排序。就是说它主要是在对大小的比较,或为包含在列表中时的排序功能而用的。

如果MyClass实现了IComparable接口之后,对于List<MyClass>就可以使用排序功能(Sort函数)。由上面看,Equals函数主要用于通过对比自定义类中的每个成员来对比两个类是否值相等;==算符则是比较是否引用相等,不建议重写;IComparable则通过对比类中一个或几个成员(如时间,序号等)来判断大小从而进行排序



本文转自HDDevTeam 51CTO博客,原文链接:http://blog.51cto.com/hddev/1217516,如需转载请自行联系原作者



 

相关文章
|
1月前
|
Java
== 和 equals 有什么区别?
本文解释了在Java中,"=="用于比较基本数据类型的值或引用类型的引用是否相等,而"equals"默认也是比较引用,但常常被重写为比较对象的值是否相等,例如在String和Integer类中,并且提供了如何自定义"equals"方法的示例。
73 0
== 和 equals 有什么区别?
|
4月前
|
Java 容器
equals与hashcode的区别与联系
equals与hashcode的区别与联系
|
Java
== 和 equals 的区别是什么
== 运算符用于比较两个对象的引用是否相等。它对于基本类型比较值的相等性,对于引用类型比较引用的相等性。当使用 == 比较两个对象时,它会检查它们是否指向相同的内存地址。如果两个对象具有相同的内存地址,则它们被认为是相等的。
70 1
|
存储 Java
“==”和equals 最大的区别
“==”和equals 最大的区别是 “==”是运算符,如果是基本数据类型,则比较存储的值;如果是引用数据类型,则比较所指向对象的地址值。 equals是Object的方法,比较的是所指向的对象的地址值,一般情况下,重写之后比较的是对象的值。
|
存储 Java
详解“==”和equals的区别
“==”和equals 最大的区别是 “==”是运算符,如果是基本数据类型,则比较存储的值;如果是引用数据类型,则比较所指向对象的地址值。 equals是Object的方法,比较的是所指向的对象的地址值,一般情况下,重写之后比较的是对象的值。
|
存储
==与equals方法的区别
==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量的引用地址是否相等,只能用==操作符。
131 0
|
存储
"=="和 equals 方法究竟有什么区别?
"=="和 equals 方法究竟有什么区别?
126 0
hashCode和equals的区别
hashCode和equals的区别
324 0
|
Java 索引
hashCode和equals的区别(一)
Hello,大家好,我是子悠,作为本周的小编我已经不想跟大家介绍自己了,这篇文章让我们跟随 Jay Pan( 哇,一位新作者哦)的步伐学习知识吧。下面是正文。 有面试官会问:你重写过 hashcode 和 equals 么,为什么重写equals时必须重写hashCode方法?equals和hashCode都是Object对象中的非final方法,它们设计的目的就是被用来覆盖(override)的,所以在程序设计中还是经常需要处理这两个方法。下面我们一起来看一下,它们到底有什么区别,总结一波!