使用其哈希码引用对象?

问题描述

| 我创建了一个对象,详细说明。 然后,我分配:int x = details.GetHashCode(); 在程序的后面,我想使用整数x访问此对象。有没有办法在C#中做到这一点? 非常感谢 保罗     

解决方法

没有: 除非您已采取适当措施阻止垃圾回收,否则可能是垃圾回收。 哈希码不是唯一的-如果有两个具有相同哈希码的对象怎么办? (有关更多信息,请参见Eric Lippert的有关哈希码的文章。) 您可以创建(例如)“ 0”并使用哈希码作为键-但我强烈建议您不要这样做。 有什么理由不想只保留对对象的引用而不是哈希码?     ,没有。 哈希码表示对象上某个哈希函数的值。 您不能由此重新创建原始对象的引用,更重要的是,不能保证该对象仍然存在。     ,如果有一种方法,它将与面向对象背道而驰。您应该将详细信息引用公开给使用的代码。     ,是的,您可以创建一个
Dictionary<int,Details>
并使用
details.GetHashCode( )
中的哈希码将对象存储在此字典中,然后再使用
x
将其从字典中拉出。 但这不是我建议做的事情!您要达到的目标是什么?     ,存储整数,然后再次检查哈希码。 请注意,在C#中,哈希码不是唯一的。如果要处理数百万个对象,则可以并且很容易使用默认实现在重复的哈希中运行。 http://msdn.microsoft.com/zh-CN/library/system.object.gethashcode.aspx \“ GetHashCode方法的默认实现不能保证不同对象的唯一返回值。”     ,
public static Detail GetDetailsFromHash(this List<Detail> detailsList,int x) {
    foreach (var details in detailslist) {
        if (details.GetHashCode() == x) {
            return details;
        }
    }
    return null;
}
但是,不能保证哈希码是唯一的     ,哈希码并不是真的要直接使用。其主要目的是使该项目可用作集合中的键。然后由收集负责将哈希映射回该对象。基本上,它使您可以执行类似于ѭ5的操作,如果未实现GetHashCode,这将更加困难...但是,除非您实现自己的集合或相等运算符,否则该函数的用途不是很多。