首页 / C# / 字符串等式运算符==在c#中
字符串等式运算符==在c#中
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了字符串等式运算符==在c#中,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2197字,纯文字阅读大概需要4分钟。
内容图文
![字符串等式运算符==在c#中](/upload/InfoBanner/zyjiaocheng/763/55b85451024142c4b74c6489cfc11fe2.jpg)
我试图在C#中查看为字符串类中的比较运算符实现的代码.发现是这样的:
//THIS IS NOT WHAT I MEANT
public static bool Equals(object objA, object objB)
{
return ((objA == objB) || (((objA != null) && (objB != null)) && objA.Equals(objB)));
}
//THIS IS WHAT I SEE REALLY and the above is what I would expect to see
public static bool Equals(string a, string b)
{
return ((a == b) || (((a != null) && (b != null)) && EqualsHelper(a, b)));
}
public static bool operator ==(string a, string b)
{
return Equals(a, b);
}
我不知道反射器是否对我起作用,但当我尝试为我自己的类实现这个策略时,我在Equals和重载的==运算符之间得到了一个无限循环(如预期的那样).在字符串类中是否有不同或者是我的Reflector报告
static Equals(object o1, object o2)
Object类上的方法是String类的一部分吗?
解决方法:
C#中的等式运算符不是多态的.当你评估objA == objB时,你实际上是在执行==(对象a,对象b)运算符实现(它检查引用相等性),而不是==(字符串a,字符串b),因为声明的类型是objA和objB变量是对象,而不是字符串.
您在代码中可能犯的错误是,在对它们求值==运算符之前,您没有将类实例转换为对象.
假设你有:
public static bool Equals(MyClass objA, MyClass objB)
{
return objA == objB || objA != null && objB != null && objA.Equals(objB);
}
…你需要用以下代替它:
public static bool Equals(MyClass objA, MyClass objB)
{
return (object)objA == (object)objB || objA != null && objB != null && objA.Equals(objB);
}
……相当于:
public static bool Equals(MyClass objA, MyClass objB)
{
return object.ReferenceEquals(objA, objB) || objA != null && objB != null && objA.Equals(objB);
}
更新:String类包含静态bool Equals(字符串a,字符串b)方法和静态bool Equals(对象a,对象b)方法.不同之处在于前者是在String类本身中定义的,而后者是从Object类(String的基类)继承的.您的反射器可能会也可能不会根据其设置显示继承的方法.
在您发布的代码中,由于声明的objA和objB类型是object,因此无论实例的实际类型如何,都将调用具有对象参数的运算符.
Update2:您更新的代码确实包含无限递归.我认为它可能是反射器工具中的一个错误.
Update3:这似乎是反汇编中的错误.实现Equals(字符串a,字符串b)运算符的第一个条件在反汇编的C#代码中显示为a == b.但是,IL代码的前几行实际上是:
ldarg.0
ldarg.1
bne.un.s IL_0006
ldc.i4.1
ret
bne.un.s定义为“如果两个无符号整数值不相等(无符号值),则为指定偏移处的目标指令的分支,短格式”.
因此,似乎正在执行参考相等.
内容总结
以上是互联网集市为您收集整理的字符串等式运算符==在c#中全部内容,希望文章能够帮你解决字符串等式运算符==在c#中所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。