今天反编译查看了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却能工作正常呢??
  

解决方案 »

  1.   

    注意
    public static bool Equals(string a, string b)
    public bool Equals(string other)
    的区别。
      

  2.   

    public static bool Equals(string a, string b)是静态方法,
    而a.Equals(b)调用的是成员方法。
      

  3.   

    我疑惑的是public static bool Equals(string a, string b)中的if (a == b)
      

  4.   

    public static bool operator ==(string a, string b)
    {
        return Equals(a, b);
    }有这样的运算符重载吗?
      

  5.   

    字符串是个特殊的类型,我估计编译器内部不会是简单调用System.String的方法吧
      

  6.   

        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]
    反编译没有正确表达出两者的区别
      

  7.   

    如下的定义:public static bool Equals(string a, string b)
    {
        ...
    }
    并不是重写Object的Equals方法:public override bool Equals(object obj)
    {
    }
    进行a==b去处的时候调用会默认的调用重写的Object的Equals而不是这里的静太的Equals方法,两者只是名称相似,但是因为声明不一样,所以还是不会引起调用上的重复的。
      

  8.   

    进行a==b运算的时候会默认的调用String类重写的Object的Equals而不是String类中的静态的Equals方法。两个Equals方法只是在名称相同,但并不是重写的Object的Equals,所以调用上是正常。
      

  9.   

    但是我照着string的写法放到自己程序里面就是堆栈溢出的异常啊!
      

  10.   

    关键是if (a == b)采用的是==的哪个重载,按照反编译出的代码应该是采用string的==重载。
    所以反编译存在问题,从dll反编译出的代码跟实际代码是有区别的,像重载在编译之后在dll里就看不出来了。
      

  11.   

    public   static   bool   Equals(string   a,   string   b) 
    为静态方法不需要实例化。public   bool   Equals(string   other) 
    该方法需要实例化。