C# 我可以使用GetHashCode跟踪对象标识吗?

C# 我可以使用GetHashCode跟踪对象标识吗?,c#,identity,gethashcode,C#,Identity,Gethashcode,GetHashCode()的用途是什么?我可以使用GetHashCode()跟踪对象标识吗?如果是这样,您能提供一个例子吗?不,哈希代码不能保证是唯一的。但是您已经有了对对象的引用,它们非常适合跟踪身份,使用。值本身用于哈希算法,例如哈希表 在其默认实现中,GetHasCode不保证对象的唯一性,因此对于.NET对象不应如此使用 在您自己的类中,重写GetHashCode以为对象创建唯一值通常是一种好的做法。它用于需要哈希的算法\数据结构(例如哈希表)。哈希代码本身不能用于跟踪对象标识,因为具有

GetHashCode()
的用途是什么?我可以使用
GetHashCode()
跟踪对象标识吗?如果是这样,您能提供一个例子吗?

不,哈希代码不能保证是唯一的。但是您已经有了对对象的引用,它们非常适合跟踪身份,使用。

值本身用于哈希算法,例如哈希表

在其默认实现中,GetHasCode不保证对象的唯一性,因此对于.NET对象不应如此使用


在您自己的类中,重写GetHashCode以为对象创建唯一值通常是一种好的做法。

它用于需要哈希的算法\数据结构(例如哈希表)。哈希代码本身不能用于跟踪对象标识,因为具有相同哈希的两个对象不一定相等。但是,两个相等的对象应该具有相同的哈希代码(这就是为什么如果覆盖一个对象而不覆盖另一个对象,C#会发出警告)。

哈希代码与标识无关,它们与相等有关。事实上,你可以说它们是关于不平等的:

  • 如果两个对象具有相同的哈希代码,则它们可能相等
  • 如果两个对象具有不同的哈希代码,则它们不相等
哈希代码不是唯一的,也不能保证相等(两个对象可能具有相同的哈希,但仍然不相等)


至于它们的用途:它们几乎总是用来快速选择可能相等的对象,然后测试实际相等性,通常是在键/值映射(例如
字典
)或集合(例如
哈希集
).

+1尽管您的措辞有点不清楚,但您的观点仍然存在。我认为您应该指出,由于
=
可以重载,因此测试引用相等性的正确方法是
对象。ReferenceEquals()
方法。感谢Martinho Fernandes的详细说明,我自己添加了它。解释无误Jon.Great.HashCode是由系统生成的吗?与随机数一样,它会返回随机值吗?默认的
GetHashCode
实现返回运行时使用的某种内部对象标识符。但是由于
GetHashCode
是虚拟的,所以您可以覆盖它以返回您想要的任何内容。当你需要推翻这两个问题时,请勾选这两个问题:谢谢你澄清了我的疑问。再次非常感谢你。:)