a==b什么时候可以为假,a.Equals(b)什么时候可以为真?我今天遇到了这种情况。我有一个正在测试是否相等的对象;Create()方法返回MyObject的子类实现。MyObjecta=MyObject.Create();我的对象b=MyObject.Create();一个==乙;//为假a.Equals(b);//为真注意我还覆盖了Equals(),它执行非常基本的检查以查看传入的对象是否为null以及是否属于子类类型。如果满足这两个条件,则对象被认为是相等的。另一个有点奇怪的是我的单元测试套件做了类似Assert.AreEqual(MyObject.Create(),MyObject.Create());的事情。//绿色条并观察预期结果。所以我猜NUnit在幕后使用a.Equals(b)而不是我假设的==b。旁注:我混合使用.NET和Java进行编程,因此我可能在这里混淆了我的期望/假设。但是,我认为a==b在.NET中比在Java中更一致,在Java中您通常必须使用equals()来测试是否相等。更新这是Equals()的实现,如下所示:publicoverrideboolEquals(objectobj){returnobj!=null&&objisMyObjectSubclass;==和Equals之间的主要区别在于==(就像所有相同的运算符一样)不是多态的,而Equals(就像任??何虚函数一样)是。默认情况下,引用类型将从==和Equals获得相同的结果,因为它们都比较引用。当然也可以用完全不同的方式编写运算符逻辑和等于逻辑,尽管这看起来很荒谬。最大的问题来自于在更高级别使用==(或其他)运算符而不是声明所需的逻辑(换句话说,将对象引用为父类,或者没有显式定义运算符,或者以不同的方式定义操作break.真正的课程)。在这种情况下,它所引用的类的逻辑用于运算符,但Equals的逻辑来自对象实际所属的类。我想强调的是,仅根据您问题中的信息,绝对没有理由认为或假设Equals将值与参考进行比较。创建这样一个类非常容易,但它不是语言规范。问题后编辑EditYourEquals实现将为该类的任何非空实例返回true。虽然语法让我觉得你不是,但你可能会混淆C#关键字(确认类型)和VB.NET中的is关键字(确认引用相等性)。如果是,则可以使用Object.ReferenceEquals(this,obj)在C#中进行显式引用比较。无论如何,这就是您看到Equalstrue的原因,因为您传入了该类的非空实例。顺便说一句,您对使用Equals的NUnit的评论也是出于同样的原因;由于运算符不是多态的,因此如果使用断言函数==,则特定类无法定义自定义相等行为。a==b检查它们是否引用同一个对象。a.Equals(b)比较内容。这是2004年JonSkeet文章的链接,该文章对其进行了更好的解释。您几乎自己回答了您的问题:我还在子类实现中覆盖了Equals(),它执行非常基本的检查以查看传入的对象是否为null以及是否属于子类的类型。如果满足这两个条件,则对象被认为是相等的。==运算符未重载-因此它返回false因为a和b是不同的对象。但是a.Equals正在调用您的重写,它可能返回true,因为a和b都不为null,并且它们都是子类的类型。所以你的问题是“a==b什么时候可以为假而a.Equals(b)什么时候可以为真?”在这种情况下,您的答案是:当您明确编码时!在Java中,a==b检查两个对象的引用是否相等(如果两个对象是同一个对象,则“rouzed”)a.equals(b)比较两个对象表示的值。它们都做同样的事情,除非它们在对象中特别超载以做其他事情。对其他地方提到的JonSkeet文章的引用。Equals方法只是在System.Object中定义的一个虚方法,并且会被选择执行此操作的任何类覆盖。==运算符是一种可以由类重载但通常具有标识行为的运算符。这里的关键字通常是。它们可以被编写来做底层类希望做的任何事情,而且它们不必做同样的事情。“==”操作测试绝对相等(除非重载);也就是说,它测试两个对象是否是同一个对象。仅当您将一个分配给另一个时,这才是正确的,即。MyObjecta=MyObject.Create();我的对象b=a;仅仅设置两个对象的所有属性并不意味着对象本身。在底层,“=”运算符比较内存中对象的地址。这样做的实际效果是,如果两个对象真正相等,改变其中一个的属性也会改变另一个,而如果它们只是相似(“等于”等于),则不会。一旦你理解了基本原理,这就很有意义了。我相信a==b检查引用的对象是否相同。通常查看值是否相同使用a.Equals(b)(这通常需要重写才能起作用)。以上就是C#学习教程:什么时候a==b可以为false,a.Equals(b)可以为true?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
