我想判断出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
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
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中的地址
不过他提示说 “重新写Equal方法,但是不重新写HashTable...”
不知道为什么?
得要先重写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方法也是很简单的,我就不明言了,用二进制运算符即可……。
在這裡我簡要說明一下,C#中有四個比較,分別是RefereceEquals(),static equals(),
instance Equals()和operator==.