为什么用一个而不是另一个?
==是身份测试.如果被测试的两个对象实际上是同一个对象,它将返回true.Equals()
执行相等测试,如果两个对象认为自己相等,则返回true.
身份测试更快,因此您可以在不需要更昂贵的相等测试时使用它.例如,比较null
空字符串或空字符串.
可以重载这些中的任何一个来提供不同的行为 - 比如 - 的身份测试Equals()
- 但是为了任何人阅读你的代码,请不要.
如下所示:某些类型喜欢String
或DateTime
为==
操作符提供重载,使其具有相等的语义.因此,确切的行为将取决于您要比较的对象的类型.
也可以看看:
http://blogs.msdn.com/csharpfaq/archive/2004/03/29/102224.aspx
@John Millikin:
如下所示:某些值类型(如DateTime为==运算符>提供了重载,赋予它相等的语义.因此,确切的行为将取决于您要比较的>对象的类型.
详细说明:
DateTime作为结构实现.所有结构都是System.ValueType的子代.
由于System.ValueType的子项存在于堆栈中,因此没有指向堆的引用指针,因此无法进行引用检查,您必须仅按值比较对象.
System.ValueType重写.Equals()和==以使用基于反射的相等性检查,它使用反射来比较每个字段的值.
因为反射有点慢,如果你实现自己的结构,重要的是覆盖.Equals()并添加你自己的值检查代码,因为这会更快.不要只调用base.Equals();
其他人几乎都有你,但我还有一个建议.每隔一段时间,你就会得到一个对他的生命(以及他所爱的人)发誓的人.Equals
更有效/更好/最佳实践或其他一些教条.我不能说效率(好吧,好吧,在某些情况下我可以),但我可以谈到一个大问题:.Equals
要求一个物体存在.(听起来很愚蠢,但却让人们失望.)
您不能执行以下操作:
StringBuilder sb = null; if (sb.Equals(null)) { // whatever }
对我来说,也许是大多数人来说,你会得到一个NullReferenceException
.然而,支持者.Equals
忘记了那个小事实.当他们看到NullRefs开始弹出时,有些甚至被"抛弃"(抱歉,无法抗拒).
(在DailyWTF发布之前的几年,我确实与那些强制要求所有相等性检查.Equals
的人合作==
.甚至证明他的不准确也没有帮助.我们只是确实打破了他所有的其他规则,以便没有参考从方法和属性永远都是空的,并且它最终得到了解决.)
==通常是"身份"等于意思是"对象a实际上是与对象b在内存中完全相同的对象".
equals()表示对象在逻辑上相等(例如,从业务角度来看).因此,如果要比较用户定义类的实例,如果希望Hashtable之类的东西能够正常工作,通常需要使用和定义equals().
如果你有一个具有属性"Name"和"Address"的谚语Person类,并且你想使用这个Person作为包含更多关于它们的信息的Hashtable的键,你需要实现equals()(和hash)以便你可以创建Person的实例并将其用作Hashtable的键以获取信息.
使用==独自一人,你的新实例将不会是相同的.