在c#代码中。发现了类似这样的东西://这不是我的意思)&&objA.Equals(objB)));}//这就是我真正看到的,上面是我希望看到的publicstaticboolEquals(stringa,stringb){return((a==b)||(((a!=null)&&(b!=null))&&EqualsHelper(a,b)));}publicstaticbooloperator==(stringa,stringb){returnEquals(a,b);我不知道反射器是否在玩我的把戏,但是当我尝试为我自己的类实现这个策略时,我在Equals和重载的==运算符之间得到了一个无限循环(正如预期的那样)。它在String类中有所不同,还是我的Reflector在属于String类的Object类上报告静态Equals(objecto1,objecto2)方法?C#中的相等运算符不是多态的。当你评估objA==objB时,你实际上是在执行==(objecta,objectb)运算符实现(它检查引用相等性),而不是==(stringa,stringb),因为声明的类型是objA和objB变量是对象,不是字符串。您在代码中可能犯的错误是您没有在对它们执行==运算符之前将类实例转换为对象。假设你有:publicstaticboolEquals(MyClassobjA,MyClassobjB){returnobjA==objB||objA!=null&&objB!=null&&objA.Equals(objB);}...您需要将其替换为:publicstaticboolEquals(MyClassobjA,MyClassobjB){return(object)objA==(object)objB||objA!=null&&objB!=null&&objA.Equals(objB);}...相当于:publicstaticboolEquals(MyClassobjA,MyClassobjB){returnobject.ReferenceEquals(objA,objB)||objA!=null&&objB!=null&&objA.Equals(objB);}更新:String类包含staticboolEquals(stringa,stringb)方法和staticboolEquals(objecta,objectb)方法。不同的是前者是在String类本身定义的,而后者是继承自Object类(String的基类)。根据其设置,您的反射器可能会或可能不会显示继承的方法。在您发布的代码中,由于objA和objB的声明类型是对象,因此无论实例的实际类型如何,都会调用带有对象参数的运算符。更新2:您更新的代码确实包含无限递归。我认为这可能是反射器工具中的错误。更新3:这似乎是拆解中的一个错误。实现Equals(stringa,stringb)运算符的第一个条件在反汇编的C#代码中显示为a==b。然而,IL代码的前几行实际上是:ldarg.0ldarg.1bne.un.sIL_0006ldc.i4.1retbne.un.s被定义为“如果两个无符号整数值不相等”(无符号值),然后分支到指定偏移量的目标指令,短格式。”因此,似乎正在执行引用相等性。没有String.Equals(object,object)方法。您会看到Object.Equals。它不递归的原因是objA==objB调用内置对象相等运算符,而不是自定义字符串相等运算符。(运算符重载根据操作数的编译时类型来解决)一个不太容易混淆的解决方案:不要使用==运算符:publicstaticboolEquals(MyClassa,MyClassb){returnReferenceEquals(a,b)||((!ReferenceEquals(a,null)&&!ReferenceEquals(b,null))&&a.Equals(b)));}它引用的equals方法是这样的:publicstaticboolEquals(stringa,stringb){/*==是对象equals-不是字符串equals*/returna==b||(a!=null&&b!=null&&string.EqualsHelper(a,b));}publicstaticbooloperator==(stringa,stringb){returnstring.Equals(a,b);即等于两个字符串而不是两个对象的方法。以上就是C#学习教程:字符串相等运算符==在c#中分享的全部内容,如果对你有用,需要进一步了解C#学习教程,希望大家多加关注——本文来自网络收集,不代表立场,如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处:
