当前位置:  开发笔记 > 编程语言 > 正文

==或.Equals()

如何解决《==或.Equals()》经验,为你挑选了4个好方法。

为什么用一个而不是另一个?



1> John Milliki..:

==是身份测试.如果被测试的两个对象实际上是同一个对象,它将返回true.Equals()执行相等测试,如果两个对象认为自己相等,则返回true.

身份测试更快,因此您可以在不需要更昂贵的相等测试时使用它.例如,比较null空字符串或空字符串.

可以重载这些中的任何一个来提供不同的行为 - 比如 - 的身份测试Equals()- 但是为了任何人阅读你的代码,请不要.


如下所示:某些类型喜欢StringDateTime==操作符提供重载,使其具有相等的语义.因此,确切的行为将取决于您要比较的对象的类型.


也可以看看:

http://blogs.msdn.com/csharpfaq/archive/2004/03/29/102224.aspx


实际上,如果你也覆盖了operator ==,FxCop强制你覆盖Equals,因为它们应该基本相同,与ReferenceEquals相反.
你怎么能说永远不要改写Equals?如果你的对象是Equal但是在应用程序的不同部分创建(比如从db中获取两次相同的行),你可能会说它们是相同的.主要的是Equals应该对应于对象的身份

2> FlySwat..:

@John Millikin:

如下所示:某些值类型(如DateTime为==运算符>提供了重载,赋予它相等的语义.因此,确切的行为将取决于您要比较的>对象的类型.

详细说明:

DateTime作为结构实现.所有结构都是System.ValueType的子代.

由于System.ValueType的子项存在于堆栈中,因此没有指向堆的引用指针,因此无法进行引用检查,您必须仅按值比较对象.

System.ValueType重写.Equals()和==以使用基于反射的相等性检查,它使用反射来比较每个字段的值.

因为反射有点慢,如果你实现自己的结构,重要的是覆盖.Equals()并添加你自己的值检查代码,因为这会更快.不要只调用base.Equals();



3> John Rudy..:

其他人几乎都有你,但我还有一个建议.每隔一段时间,你就会得到一个对他的生命(以及他所爱的人)发誓的人.Equals更有效/更好/最佳实践或其他一些教条.我不能说效率(好吧,好吧,在某些情况下我可以),但我可以谈到一个大问题:.Equals要求一个物体存在.(听起来很愚蠢,但却让人们失望.)

您不能执行以下操作:

StringBuilder sb = null;
if (sb.Equals(null))
{
    // whatever
}

对我来说,也许是大多数人来说,你会得到一个NullReferenceException.然而,支持者.Equals忘记了那个小事实.当他们看到NullRefs开始弹出时,有些甚至被"抛弃"(抱歉,无法抗拒).

(在DailyWTF发布之前的几年,我确实与那些强制要求所有相等性检查.Equals的人合作==.甚至证明他的不准确也没有帮助.我们只是确实打破了他所有的其他规则,以便没有参考从方法和属性永远都是空的,并且它最终得到了解决.)



4> Joshua DeWal..:

==通常是"身份"等于意思是"对象a实际上是与对象b在内存中完全相同的对象".

equals()表示对象在逻辑上相等(例如,从业务角度来看).因此,如果要比较用户定义类的实例,如果希望Hashtable之类的东西能够正常工作,通常需要使用和定义equals().

如果你有一个具有属性"Name"和"Address"的谚语Person类,并且你想使用这个Person作为包含更多关于它们的信息的Hashtable的键,你需要实现equals()(和hash)以便你可以创建Person的实例并将其用作Hashtable的键以获取信息.

使用==独自一人,你的新实例将不会是相同的.

推荐阅读
php
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有