当前位置: 首页 > 编程语言 > C#

Object==equality失败,.Equals成功,是否有意义?

时间:2023-04-11 01:24:14 C#

Object==equality失败,但是.Equals成功。是否有意义?可能重复:C#中==运算符和Equals()方法之间的区别?两种形式的平等,第一种失败,第二种失败。(object)"abc"==(object)"abc"false((object)"abc").Equals((object)"abc")true在下面的参考中我们看到“equalsinC#Theexpressionoperatorisnotpolymorphic"ref:C#中的字符串相等运算符==顺便说一句:仍然不确定为什么这是一个问题。我想可能是,但不是因为这个测试成功了。staticvoidMain(string[]args){varo=newclassOfT(){val="abc"};Console.WriteLine((object)o.val=="abc");}publicclassclassOfT{publicstringval{get;放;顺便说一句:我不同意这个问题的确切重复规则,但是嘿。答案解释:...String类包含一个staticboolEquals(stringa,stringb)方法和一个staticboolEquals(objecta,objectb)方法。不同的是,前者是在String类本身定义的,而后者是继承自Object类(它是String的基类)从语义上讲这是有道理的,但在更广泛的OO和C#语言的上下文中是这样吗在上下文中有意义吗?我为什么要为这个问题烦恼?好吧,刚发现一个错误,我想用押韵或理由将其归档在我的大脑中,而不是“只记住这个”,它会在类别之前咬你。更新:目前正在考虑使用基元(从功能的角度来看)与多态性。由于我一直在做越来越多的功能性工作,这可能就是母语让我感到困惑的原因。我还没有想到这一点(不,我不是务实的。我被语言设计吸引了)。感谢你的回复!(object)"abc"将从字符串对象创建一个对象引用。执行(object)"abc"==(object)"abc"将创建两个不相等的对象引用。但是,使用equals方法会检查存储的字符串的值是否相等。同样,这不是所有对象的默认实现,而是String对象的默认实现。与任何自定义对象一样,您应该定义自己的equals方法的自定义实现来实现此行为。代码示例返回true。(object)"abc"==(object)"abc"我认为您提供的示例与应用程序中返回false的代码不同。CLR使用字符串驻留来优化字符串。转换为System.Object将导致==运算符比较引用,并且由于字符串驻留功能,==运算符将导致true。如果==运算符两边的参数将引用堆上的不同字符串对象,则比较只会返回false。检查程序集是否已标记有[assembly:CompilationRelaxations(System.Runtime.CompilerServices.CompilationRelaxations.NoStringInterning)]属性。字符串比较应该通过String.Compare完成,http://blogs.msdn.com/b/abhinaba/archive/2005/10/28/486173.aspxhttp://msdn.microsoft.com/en-US/vstudio/aa496123?pull=/library/en-us/dndotnet/html/StringsinNET20.asp我不认为你“发现了一个错误”,因为微软已经在.NETBCL中多次这样做了,我们作为开发人员必须适应这个条件。一个简单的例子是,varip1=IPAddress.Parse("127.0.0.1");varip2=IPAddress.Parse("127.0.0.1");你会发现ip1!=ip2,但是ip1.Equals(ip2)==true。建议的比较方法是IPAddress.Compare(ip1,ip2)。无论如何,您有时需要记住一些事情。==运算符:对于预定义的值类型,相等运算符(==)如果操作数的值相等则返回true,否则返回false。对于字符串以外的引用类型,如果它的两个操作数引用同一个对象,则==返回true。对于字符串类型,==比较字符串的值。equal:被String类重写,如果obj为String则返回true,其值与本实例相同;否则,假的。如果你的代码如下,vars1=GetString1();//一些字符串对象vars2=GetString2();//一些包含与s1相同内容的字符串对象(object)s1==(object)s2返回false-因为==比较对象的引用(如果没有interned,它们将不同)((object)s1).Equals((object)s2)返回true-因为在运行时将在实际字符串之间调用Equals但是,在当前形式中,您的代码(object)"abc"==(object)"abc"((object)"abc").Equals((object)"abc")在这两种情况下都应该返回true因为具有相同的值Literalstrings默认情况下会被破坏,因此对同一对象的引用(即引用也相等)以上是C#学习教程:Object==相等失败,但.Equals成功。是否有意义?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: