我想判断出c和d是值相等的。   但是以下的语句都返回false。谁能给我讲讲如何判断?
            Class1 c = new Class1();
            c.C1 = "t";
            Class1 d = new Class1();
            d.C1 = "t";
            Console.WriteLine(c.Equals(d));//false
            Console.WriteLine(d.Equals(c));//false
            Console.WriteLine(c == d);//false
            Console.WriteLine(System.ValueType.Equals(c, d));//false
            Console.WriteLine(System.ValueType.ReferenceEquals(c, d));//false
            Console.WriteLine(object.Equals(c, d));//false
            Console.WriteLine(object.ReferenceEquals(c, d));//false

解决方案 »

  1.   

    Console.WriteLine(c.Equals(d));//false
                Console.WriteLine(d.Equals(c));//false
                Console.WriteLine(c == d);//false
                Console.WriteLine(System.ValueType.Equals(c, d));//false
                Console.WriteLine(System.ValueType.ReferenceEquals(c, d));//false
                Console.WriteLine(object.Equals(c, d));//false
                Console.WriteLine(object.ReferenceEquals(c, d));//false
    -----------------------------------------------------------------
    引用相等,表示两个变量是否引用同一个对象
    值相等,表示两个变量引用的对象的值是否相等由于你没有重写Equals和==的代码,所以全都用的是默认的实现
    c.Equals(d);
    d.Equals(c);
    object.Equals(c,d);
    ------------
    使用的是object.Equals的默认函数,该函数为引用相等,即是否引用的同一个对象,因为c和d不是同一个对象,所以为false,你可以重载Equals,写成值相等,让它比较Class1的C1字段,根据这个比较来返回bool值c==d;
    object.RefrenceEquals(c,d);
    ValueType.ReferenceEquals(c, d);
    都是引用相等,object.RefrenceEquals为一个Sealed的方法,所有的调用,使用都是object.RefrenceEqualsValueType.Equals(c, d);
    -----------
    ValueType是所有值类型的基类,因为c和d都是引用类型,所以它比较的是c和d中的地址
      

  2.   

    哦 谢谢楼上的认真解释,最后我重新写了 Equal方法。
    不过他提示说 “重新写Equal方法,但是不重新写HashTable...”
    不知道为什么?
      

  3.   

    要重写Equal()
    得要先重写GetHashCode()
      

  4.   

    如果你打算重写Equals方法,就应该同时重写GetHashCode方法。
    一般来说,你在Equals方法里面用什么字段来作比较,在GetHashCode方法里面就调用这个字段的GetHashCode好了。
    如,你规定如果下面这个类的两个对象的_id相等,就算相等的话:
    public class MyClass
    {
      private int _id;
      public MyClass( int id )
      {
        _id = id;
      }  public override bool Equals( object obj )//譬如说你这里这样写
      {
        MyClass instance = obj as MyClass;
        if ( instance != null )
          return this._id == instance._id;
      }  public overrie int GetHashCode()//那么这个方法可以这样写
      {
        return this._id.GetHashCode();
      }
    }如果你有多个关键字段需要比较的话,GetHashCode方法也是很简单的,我就不明言了,用二进制运算符即可……。
      

  5.   

    你可以參見愚翁博客中對Effective C#的翻譯,裡面有對equal的介紹。
    在這裡我簡要說明一下,C#中有四個比較,分別是RefereceEquals(),static equals(),
    instance Equals()和operator==.