【发布时间】:2019-05-02 20:58:12
【问题描述】:
我讨厌打败 dead horse。在@eric-lippert 的blog 中,他说:
对象的哈希值在其整个生命周期内都是相同的
然后跟进:
然而,这只是一个理想情况的指导方针
所以,我的问题是这样的。
对于 POCO(没有被覆盖)或框架(如 FileInfo 或 Process)对象,GetHashCode() 方法的返回值是否保证在其生命周期内保持相同?
附:我说的是预分配的对象。 var foo = new Bar(); foo.GetHashCode() 将始终返回相同的值。
【问题讨论】:
-
Is the return value of the GetHashCode() method guaranteed to be the same during its lifetime,没有。易于测试,Console.WriteLine("What am I?".GetHashCode()) Console.WriteLine("What am I?".GetHashCode())运行这些,你会看到。GetHashCode从来都不是真正稳定的;一个原因是因为它在 .NET 中的不同实现中可能会有所不同 -
@Çöđěxěŕ 是一样的。
-
@Çöđěxěŕ 这就是为什么我说对象的生命周期。
-
Sh!tness,我很抱歉,是的,在同一程序执行中的生命周期,是,但不是不同的程序执行。例如在控制台应用程序中运行它,然后在另一个应用程序中运行它,您应该会看到不同...
-
如果你自己不重写 GetHashCode,你是安全的。如果您确实覆盖 GetHashCode 并遵守此约定,那么您是安全的。 .NET 框架/标准/核心类遵守此约定(我不知道框架库中的任何类型会违反此约定)。除非你使用来自完全不称职的程序员的第 3 方代码(请原谅),否则来自第 3 方库的类型也应该没有问题......