string 的比较

yanzimywife_2005 2007-10-28 04:15:06
今天反编译查看了System.String的代码发现string的判等是这样进行的:
public static bool Equals(string a, string b)
{
if (a == b)
{
return true;
}
if ((a != null) && (b != null))
{
return a.Equals(b);
}
return false;
}

public static bool operator ==(string a, string b)
{
return Equals(a, b);
}

按我的理解如果a==b应该是个死循环啊?而且我自己写了一个实例也印证了我的想法,可是为什么这样string却能工作正常呢??



...全文
205 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
changmaohai1980 2007-11-06
  • 打赏
  • 举报
回复
public static bool Equals(string a, string b)
为静态方法不需要实例化。

public bool Equals(string other)
该方法需要实例化。

danjiewu 2007-11-06
  • 打赏
  • 举报
回复
关键是if (a == b)采用的是==的哪个重载,按照反编译出的代码应该是采用string的==重载。
所以反编译存在问题,从dll反编译出的代码跟实际代码是有区别的,像重载在编译之后在dll里就看不出来了。
yanzimywife_2005 2007-11-05
  • 打赏
  • 举报
回复
但是我照着string的写法放到自己程序里面就是堆栈溢出的异常啊!
北京的雾霾天 2007-11-05
  • 打赏
  • 举报
回复
进行a==b运算的时候会默认的调用String类重写的Object的Equals而不是String类中的静态的Equals方法。两个Equals方法只是在名称相同,但并不是重写的Object的Equals,所以调用上是正常。
北京的雾霾天 2007-11-05
  • 打赏
  • 举报
回复
如下的定义:

public static bool Equals(string a, string b)
{
...
}


并不是重写Object的Equals方法:

public override bool Equals(object obj)
{
}


进行a==b去处的时候调用会默认的调用重写的Object的Equals而不是这里的静太的Equals方法,两者只是名称相似,但是因为声明不一样,所以还是不会引起调用上的重复的。
yanzimywife_2005 2007-11-05
  • 打赏
  • 举报
回复
也只能理解为反编译除了问题,要不说不通啊!
vwxyzh 2007-10-29
  • 打赏
  • 举报
回复
    if (a == b)
{
return true;
}

实际上是:
[code=MSIL] L_0000: ldarg.0 //a
L_0001: ldarg.1 //b
L_0002: bne.un.s L_0006 //这里是判等,如果不等转跳到后面
L_0004: ldc.i4.1 //true
L_0005: ret //返回
L_0006: ...
[/code]
反编译没有正确表达出两者的区别
yanzimywife_2005 2007-10-29
  • 打赏
  • 举报
回复
顶上去,看能不能得到答案!
yanzimywife_2005 2007-10-28
  • 打赏
  • 举报
回复
没有人能给个确切的答案吗???
viena 2007-10-28
  • 打赏
  • 举报
回复
字符串是个特殊的类型,我估计编译器内部不会是简单调用System.String的方法吧
viena 2007-10-28
  • 打赏
  • 举报
回复
看了一下,还真是

估计编译器有特殊的处理吧~
viena 2007-10-28
  • 打赏
  • 举报
回复
public static bool operator ==(string a, string b)
{
return Equals(a, b);
}


有这样的运算符重载吗?
yanzimywife_2005 2007-10-28
  • 打赏
  • 举报
回复
我疑惑的是public static bool Equals(string a, string b)中的

if (a == b)

wuyi8808 2007-10-28
  • 打赏
  • 举报
回复
public static bool Equals(string a, string b)是静态方法,
而a.Equals(b)调用的是成员方法。
wuyi8808 2007-10-28
  • 打赏
  • 举报
回复
注意
public static bool Equals(string a, string b)
public bool Equals(string other)
的区别。

111,115

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧