find
在上面的代码中,GetHashCode()方法为a和b返回10和10,但是我想比较地址。这就是GetHashCode()方法的工作方式。请解释。
答案 0 :(得分:3)
请参阅the docs(重点是我):
GetHashCode方法可以被派生类型覆盖。如果没有重写GetHashCode,则通过调用基类的Object.GetHashCode方法来计算引用类型的哈希码,该方法基于对象的引用来计算哈希码;有关更多信息,请参见RuntimeHelpers.GetHashCode。换句话说,ReferenceEquals方法为其返回true的两个对象具有相同的哈希码。 如果值类型未覆盖GetHashCode,则基类的ValueType.GetHashCode方法使用反射根据类型字段的值来计算哈希码。换句话说,其字段具有相等值的值类型具有相等的哈希码。有关覆盖GetHashCode的更多信息,请参见“继承者的注意事项”部分。
根据this answer,GetHashCode()
的{{1}}旨在返回int
的值。如果您查看int
的{{3}},也可以看到这一点:
Int32
答案 1 :(得分:1)
// The absolute value of the int contained.
public override int GetHashCode() {
return m_value;
}
正常工作。根据{{3}}:
哈希码是一个数字值,用于在基于哈希的集合(例如Dictionary类,Hashtable类或从DictionaryBase类派生的类型)中插入和标识对象。 GetHashCode方法为需要快速检查对象相等性的算法提供此哈希代码。
就GetHashCode()
而言,GetHashCode()
的哈希码将始终与-相同,因为-int a=10,b=10
是原始类型-int
和{ {1}}彼此相等。
答案 2 :(得分:0)
如果要检查引用是否相等(当您拥有来自同一类的对象而不是来自两个不同类的对象时,这很有用),则应使用
.ReferenceEquals()
测试两个对象是否是同一实例,并且不能被覆盖。
因为有GethashCode:-
Two objects that are equal return hash codes that are equal.
However, the reverse is not true:
为此,您应按如下所示在类中重写GetHashcode并根据属性计算哈希码,然后尝试通过重写Equal方法来查找是否相等。
public class FirstClass
{
public int Id {get;set;}
public override bool Equals(Object obj)
{
if (!(obj is FirstClass)) return false;
FirstClass f = (FirstClass) obj;
return thid.Id == f.id;
}
public override int GetHashCode()
{
return this.Id;
}
}
从您的代码中,您就有两个不同类的对象,因为它们属于两个不同类,它们将不相等。请参阅{#3}的C#文档
因此这行代码无效:
Console.WriteLine("firstClass1==secondClass1:\t"+SameReference(firstClass1,secondClass1));