GetHashCode()方法返回值而不是地址

时间:2018-07-02 06:00:16

标签: c#

find

在上面的代码中,GetHashCode()方法为a和b返回10和10,但是我想比较地址。这就是GetHashCode()方法的工作方式。请解释。

3 个答案:

答案 0 :(得分:3)

请参阅the docs(重点是我):

  

GetHashCode方法可以被派生类型覆盖。如果没有重写GetHashCode,则通过调用基类的Object.GetHashCode方法来计算引用类型的哈希码,该方法基于对象的引用来计算哈希码;有关更多信息,请参见RuntimeHelpers.GetHashCode。换句话说,ReferenceEquals方法为其返回true的两个对象具有相同的哈希码。 如果值类型未覆盖GetHashCode,则基类的ValueType.GetHashCode方法使用反射根据类型字段的值来计算哈希码。换句话说,其字段具有相等值的值类型具有相等的哈希码。有关覆盖GetHashCode的更多信息,请参见“继承者的注意事项”部分。

根据this answerGetHashCode()的{​​{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));