object s1=new string(new char[] {'a'});
 object s2=new string(new char[] {'a'}); object a=new object();
 object b=new object(); Response.Write(s1==s2)false//false
 Response.Write(s1.Equals(s2))//true Response.Write(a==b)true//false
 Response.Write(a.Equals(b))//false用MSDN官方的说明:对于预定义的值类型,如果操作数的值相等,则相等运算符 (==) 返回 true,否则返回 false。对于 string 以外的引用类型,如果两个操作数引用同一个对象,则 == 返回 true。对于 string 类型,== 比较字符串的值。
个人理解为:
S1和S2由于S1和S2所分配的地址上储存的是2个不同对象的内存地址所以S1==S2返回FALSE,Equals比较的是S1和S2储存空间里储存的对象地址对应的对象的内容是否相同,而这2个对象的内容都为 'a'  所以S1.Equals(S2)返回true ;a和b由于分配的给A和B的内存控件里储存的是2个不同对象的内存地址所以A和B是不同的。但是a.Equals(b)比较的是两个操作数是否引用同一个对象,也就是说A和B储存空间里储存的对象地址对应的对象的内容是否相同。A和B储存了2个地址是2个不同的对象的地址,但是这2个对象都是new object();他们的内容应该是一样啊为什么会返回FALSE 这就想不通了;很想请教下Equals对于除string以外的对象  是怎么比较对象是否相同的 是判断对象的储存空间上的被引用对象内存地址是否相同;还是判断储存空间上对应地址的对象的内容是否相同,如果是这样判断那么又是怎么判断对象是否相同,是先看对象是否是string,如是string 则判断值是否相同,否者判断OBJECT的类型和此对象储存空间里储存的内容是否相同 虽然做了几年的开发了,但是一只没有太关注过这个问题,最近突然看到有人提问,就去看看结果自己弄迷糊了。希望各位大侠指点,最好能具体点原理一点。 谢谢了~

解决方案 »

  1.   

    但是这2个对象都是new object();你这都说了是两个对象,为什么a和b还是引用的同一个对象呢?应该是False
      

  2.   

    以前老用“”==“”来判断,就是因为Equals老搞混。
      

  3.   

    MSDN的示例using System;public class Sample {
        void Method() {
        Object Obj1 = new Object();
        Object Obj2 = new Object();
        Console.WriteLine(Obj1.Equals(Obj2)); //===> false
        Obj2 = Obj1;
        Console.WriteLine(Obj1.Equals(Obj2)); //===> true
        }
    }
      

  4.   


    // == 使用的是 Object.ReferenceEquals 方法
    // 而 Equals 方法已经被 String 类给重载了,内部会判断实际内容
      

  5.   

    ==就不用说了,都是判断两个对象,虽然内容一样,其实内存的地址是不同的,判断的是地址
    Equal 方法已经被 String 类给重载了,内部会判断实际内容
    S1 S2的实际内容相同 返回TRUE但是 A和B 都是创建了一个空对象,并没有初始化,a.Equals(b)这个时候和a==b其实是等同的 都是两个对象的判断
      

  6.   

    点此进入里面的第二页 说明了 equls的工作原理
      

  7.   

    貌似很好理解,对一般的object对象,==和Equals方法都是比较引用地址,所以a==b和a.Equals(b)都返回false。在这里,==和Equals方法唯一的不同是如果a为null,a==b返回false,而a.Equals(b)则会抛出异常
    string重写了这个方法,所以S1.Equals(S2)返回true