📜  C#|带示例的Object.GetHashCode()方法(1)

📅  最后修改于: 2023-12-03 14:40:30.528000             🧑  作者: Mango

C# | 带示例的Object.GetHashCode()方法

在 C# 编程语言中,Object.GetHashCode() 方法用于获取对象的哈希代码。哈希代码是可用于对大型数据集进行高效查找的数字值。对象的哈希代码是在创建对象时根据对象的内容计算的。在哈希表等数据结构中,哈希值可用于快速查找和比较对象。

语法

以下是 Object.GetHashCode() 方法的语法:

public virtual int GetHashCode ();

GetHashCode() 方法未接受任何参数,并返回一个整数,表示对象的哈希代码。

用法

哈希代码是根据对象的内容计算的,因此具有相同内容的两个对象将具有相同的哈希代码。C# 运行时使用哈希代码来实现大量的集合类,例如哈希表、哈希集等。在使用这些集合类时,通常需要实现自定义对象的哈希代码,以便正确进行查找、比较等操作。

在 C# 中,如果要实现自定义哈希代码,需要同时重写 GetHashCode()Equals() 方法。这两个方法都需要根据对象的内容来判断两个对象是否相等。

以下是一个示例,展示了如何重写 GetHashCode() 方法和 Equals() 方法:

class Person
{
    public string Name { get; set; }
    public int Age { get; set; }

    public override int GetHashCode()
    {
        return Name.GetHashCode() ^ Age.GetHashCode();
    }

    public override bool Equals(object obj)
    {
        if (obj == null || !(obj is Person))
            return false;

        Person p = (Person)obj;

        return (Name == p.Name && Age == p.Age);
    }
}

上面的代码实现了一个名为 Person 的自定义类。该类包含一个名字和一个年龄属性。GetHashCode() 方法使用异或运算符对两个属性的哈希代码进行位运算。

Equals() 方法比较两个 Person 对象的名字和年龄属性是否相等。这个方法是实现自定义哈希代码的重要组成部分。

示例

下面是一个使用自定义 Person 类的示例,演示了如何使用哈希代码来查找对象:

Person p1 = new Person { Name = "Tom", Age = 25 };
Person p2 = new Person { Name = "John", Age = 30 };
Person p3 = new Person { Name = "Tom", Age = 25 };

HashSet<Person> set = new HashSet<Person>();

set.Add(p1);
set.Add(p2);

bool containsP1 = set.Contains(p1); // true
bool containsP2 = set.Contains(p2); // true

bool containsP3 = set.Contains(p3); // false,因为 p3 的哈希代码与 p1 的不同

在上面的示例中,我们创建了三个 Person 对象 p1p2p3。我们将 p1p2 添加到 HashSet<Person> 实例 set 中。由于 set 使用哈希代码来存储和查找对象,因此当我们调用 set.Contains() 方法时,它能够正确地验证 p1p2 是否存在于 set 中。

注意,我们无法将 p3 添加到 set 中,因为其哈希代码与 p1 的哈希代码不同。这是因为 p1p3 具有相同的属性,但是它们的引用不同。因此,我们必须根据对象的内容(即 NameAge 属性)来判断它们是否相等。

总结

Object.GetHashCode() 方法用于获取对象的哈希代码,是 C# 中实现哈希表、哈希集等集合类的基础。为了正确地使用 C# 集合类,重写 GetHashCode()Equals() 方法是很重要的。在实现自定义哈希代码时,我们需要根据对象的内容(例如属性)计算哈希值,以便正确地进行查找、比较等操作。