为什么HashSet <t>归因于MayLeakOnAbort,但是Dictionary <k,v>不是?</k,v> </t>

时间:2014-04-17 18:37:30

标签: c# .net sql-server memory hashset

我注意到在尝试为SQL Server编写CLR过程时,由于归因于[HostProtectionAttribute(SecurityAction.LinkDemand, MayLeakOnAbort = true)]而不允许使用HashSet。 SQL Server CLR过程不允许使用设置了MayLeakOnAbort的对象。好的,所以在CLR程序中有一些类要避免,甚至可能会考虑在CLR程序之外使用。奇怪的是,Dictionary<K,V> 同样受到限制。现在基于我对HashSet是什么以及Dictionary是什么的理解,我希望Dictionary应该具有Hashset的所有复杂性,然后然后。那么,为什么词典没有受到类似的限制呢?我正在“考虑使用HashSet<T>”并认真考虑使用字典,即使我没有编写CLR程序,只需要一个可以快速测试复杂成员资格的集合key(没有定义比较,散列或相等接口的对象的对象引用)。我最好使用Hashset或Dictionary吗? Hashset是否与众不同之处在于它允许使用没有比较的类或基于内存地址的相等接口,或者可能是HashSet不那么“干净”的原因?

2 个答案:

答案 0 :(得分:15)

HashSet<T>包含使用IntersectWith使用不安全代码实现的stackalloc等方法。 Dictionary<TKey, TValue>不包含任何此类方法。虽然可以将自己的程序集标记为不安全,并避免使用冒险的方法,但我在SQL CLR函数中放弃并使用了Dictionary<T, bool>,其中所有值均为true ,正是出于这个原因。

答案 1 :(得分:-1)

Dictionary基于HashTable,而不是HashSet。虽然它们在概念上非常相似,但HashSet的实现包括一些不安全的方法,而HashTable和Dictionary则没有。

Dictionary主要使用HashTable作为加速键空间搜索的手段。鉴于用于字典键的类型的GetHashCode()的有效实现,字典中的查找是最佳情况恒定时间和最坏情况线性时间。

HashSet是一个仅用于存储唯一值的集合(没有键控机制),并且需要在类上正确实现GetHashCode才能正常运行。

HashTables和Dictionaries用于按键查找值。 HashSets仅用于维护一组唯一对象,并且没有键控机制。

如果您不需要唯一性保证,或者由实现ISet的东西提供的其他功能,则没有真正的理由使用HashSet而不是数组或列表。

如果您需要能够通过密钥从集合中获取项目,请使用HashTable或词典(首选词典,因为它是通用的,因此您不会经常装箱/取消装箱一切)。 / p>

请参阅以下链接以获取解释:

http://msdn.microsoft.com/en-us/library/bb397727(v=vs.110).aspx

http://msdn.microsoft.com/en-us/library/4yh14awz(v=vs.110).aspx