Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么GetHashCode()很重要?_C#_.net - Fatal编程技术网

C# 为什么GetHashCode()很重要?

C# 为什么GetHashCode()很重要?,c#,.net,C#,.net,我试图理解对象.GetHashCode()的用途。我读到它被集合用来唯一地标识密钥。但是我想测试一下,结果并不是我所期望的 struct Animal { public string Name { get; set; } public int Age { get; set; } public Animal(string name, int age) : this() { Name = name; Age = age; }

我试图理解
对象.GetHashCode()
的用途。我读到它被集合用来唯一地标识密钥。但是我想测试一下,结果并不是我所期望的

struct Animal
{
    public string Name { get; set; }
    public int Age { get; set; }

    public Animal(string name, int age) : this()
    {
        Name = name;
        Age = age;
    }

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

object doggy = new Animal("Dog", 25);
object cat = new Animal("Cat", 25);

Hashtable table = new Hashtable();
table.Add(doggy, "Dog");
table.Add(cat, "Cat");

Console.WriteLine("{0}", table[cat]);
Console.WriteLine("{0}", table[doggy]);
我本以为“Cat”会覆盖“Dog”或某种错误,告诉我“密钥已经存在”,但输出是无效的

“猫” “狗”


GetHashCode
只是第一个检查,用于确定不相等和可能相等。然后,检查等于。对于对象,它默认为引用相等,对于结构,它是一个成员级比较。重写
Equals
以给出适当的实现(与哈希代码配对),它应该给出您期望的结果(重复键)


顺便说一句,IDE可能已经给了您一个警告,即
GetHashCode
Equals
应始终一起处理…

哈希代码被用作将对象划分为组的第一个检查。如果集合包含其中每个项的哈希代码,则它可以通过首先搜索哈希代码与所搜索项的哈希代码匹配的项来搜索项。一旦找到一个或多个这样的项目,它就可以更详细地检查它们。理想情况下,不相等的对象总是会返回不同的哈希代码,但这并不实际。如果不相等的对象返回相同的哈希代码,则可能需要在查找其中一个时详细检查所有哈希代码。

此外,MSDN声明:“重写GetHashCode的派生类也必须重写Equals,以保证被认为相等的两个对象具有相同的哈希代码;否则,哈希表类型可能无法正常工作。“顺便说一句,它与问题无关,但对于这种情况,
struct
是一个非常糟糕的选择。如果有疑问,请使用
class
。如果没有疑问,可能仍然使用
class
。非常罕见(有效地)在C#中声明一个
struct
。是的,我同意,实际上测试最初是用类进行的,但我尝试替换为struct,看看它是否有什么不同:)