0

我已经创建了一个对象,请说详细信息。然后我分配: int x = details.GetHashCode();

在程序的后面,我想使用整数 x 访问这个对象。有没有办法在 C# 中做到这一点?

非常感谢

保罗

4

7 回答 7

7

不:

  • 它可能已经被垃圾收集了,除非你有办法阻止它。
  • 哈希码不是唯一的——如果有两个对象具有相同的哈希码怎么办?(有关更多信息,请参阅Eric Lippert 关于哈希码的帖子。)

可以创建(比如说) aDictionary<int, Details>并使用哈希码作为键 - 但我强烈建议您要这样做。

您有什么理由不想只保留对对象的引用而不是哈希码?

于 2011-05-24T10:43:30.113 回答
0

不。

Hashcode 表示对象上的某个散列函数的值。

您无法从中重新创建原始对象的引用,更重要的是,不能保证该对象仍然存在。

于 2011-05-24T10:45:04.747 回答
0

如果有一种方法,它将违背面向对象。您应该将详细信息引用公开给使用代码。

于 2011-05-24T10:45:07.583 回答
0

是的,您可以使用哈希码创建一个Dictionary<int,Details>并将对象存储在此字典中details.GetHashCode( ),然后使用x.

但这不是我建议做的事情!你想达到什么目的?

于 2011-05-24T10:45:17.603 回答
0

存储整数并再次检查哈希码。

请注意,在 C# 中,Hashcode 并不保证是唯一的。如果您正在处理几百万个对象,您可以并且将使用默认实现非常容易地运行重复哈希。

http://msdn.microsoft.com/en-us/library/system.object.getashcode.aspx

“GetHashCode 方法的默认实现不保证不同对象的唯一返回值。”

于 2011-05-24T10:46:57.040 回答
0
public static Detail GetDetailsFromHash(this List<Detail> detailsList, int x) {
    foreach (var details in detailslist) {
        if (details.GetHashCode() == x) {
            return details;
        }
    }
    return null;
}

但是不保证哈希码是唯一的

于 2011-05-24T10:48:44.997 回答
0

哈希码并不是真的要直接使用。它的主要目的是使该项目可以用作集合中的键。然后集合负责将哈希映射回对象。基本上它可以让你做一些Dictonary<details, myClass2>如果没有实现 GetHashCode 会更难的事情......但是除非你实现自己的集合或相等运算符,否则该函数并没有太多用处。

于 2011-05-24T10:51:48.233 回答