今天反编译查看了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却能工作正常呢??
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却能工作正常呢??
public static bool Equals(string a, string b)
public bool Equals(string other)
的区别。
而a.Equals(b)调用的是成员方法。
{
return Equals(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]
反编译没有正确表达出两者的区别
{
...
}
并不是重写Object的Equals方法:public override bool Equals(object obj)
{
}
进行a==b去处的时候调用会默认的调用重写的Object的Equals而不是这里的静太的Equals方法,两者只是名称相似,但是因为声明不一样,所以还是不会引起调用上的重复的。
所以反编译存在问题,从dll反编译出的代码跟实际代码是有区别的,像重载在编译之后在dll里就看不出来了。
为静态方法不需要实例化。public bool Equals(string other)
该方法需要实例化。