目前,我有一个解决方案,通过Object.GetHashCode
获取哈希码然后将其存储在HashSet<int>
中,跟踪我感兴趣的对象。
但是,我也一直在学习bitmasks和bitwise操作,我对他们非常感兴趣。 Here is a great question我发现了接近我要做的事情。但是,我似乎无法使哈希码有效地工作。
There is also this question,但当哈希码为int
(32位)时,它似乎处理5位数。
我确实得到BitArray
解决方案(来自第一个引用的问题),但它没有我当前的HashSet方法那么快。这是因为BitArray
中需要创建的项目数量足以计算所有已知哈希码(int.MaxValue
)。
在使用BitArray
进行此工作时,是否应该考虑使用位掩码/按位操作?或者我完全不在这里,应该坚持我的HashSet<int>
解决方案?
答案 0 :(得分:0)
这确实是一个走出人迹罕至的道路的例子,与对参考/内存管理的误解相结合。在我的例子中,我使用<div class="i_have_an_image">
<img src="http://www.fillmurray.com/460/300" alt="">
<h2>I appear on top of the image, but aligned along the bottom</h2>
</div>
对象来存储来自实例上的方法调用的缓存结果。我无法使用Dictionary<TKey, TValue>
,因为密钥至少有三个部分:
如果我使用ConditionalWeakTable
我将不得不创建“又一个对象”(类),这将需要另一个分配,但更糟糕但不会被任何东西引用(除了ConditionalWeakTable
)并且会在第一次传递时收集垃圾(这确实是related to another open -- but now also solved -- question of mine)。
经过深思熟虑后,我意识到答案确实存在于ConditionalWeakTable
中。不是将上面的3个项目用作关键字,而是使用由第1部分和第2部分组成的ConditionalWeakTable
,然后将Delegate
与之配对。
或者作为字段初始化:
Dictionary
(另外值得注意的是使用StructuralEqualityComparer
和上面的词典来完成这项工作。)
这当然可以满足我的一切需求。它将跟踪对象,直到从内存中清除包含该方法(并且包含readonly ConditionalWeakTable<Delegate, Dictionary<object[], object>> cache = new ConditionalWeakTable<Delegate, Dictionary<object[], object>>();
的方法)的引用对象。此时,缓存的字典也将被释放,清除其所有内容。