为什么HashSet<;T>;归因于MayLeakOnAbort,但Dictionary<;K、 V>;

本文关键字:gt lt Dictionary 归因于 HashSet 为什么 MayLeakOnAbort | 更新日期: 2023-09-27 17:58:59

我在尝试为SQL Server编写CLR过程时注意到,由于HashSet的属性为[HostProtectionAttribute(SecurityAction.LinkDemand, MayLeakOnAbort = true)],因此不允许使用它。SQL Server CLR过程不允许使用设置了MayLeakOnAbort的对象。好吧,在CLR过程中有一些类需要避免,甚至可能在使用CLR过程之外的类时三思而后行。奇怪的是,Dictionary<K,V>而不是类似的限制。现在,基于我对什么是HashSet和什么是Dictionary的理解,我认为Dictionary应该具有HashSet的所有复杂性,然后是。那么,为什么《词典》没有受到类似的限制呢?我正在"再三考虑使用HashSet<T>",并认真考虑使用Dictionary,尽管我不是在编写CLR过程,只需要一个可以快速测试复杂键成员身份的集合(没有定义比较、哈希或相等接口的对象的对象引用)。我最好使用哈希集还是字典?Hashset的不同之处在于,它将允许使用没有完全基于内存地址的比较或相等接口的类,或者可能是Hashset不那么"干净"的原因?

为什么HashSet<;T>;归因于MayLeakOnAbort,但Dictionary<;K、 V>;

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

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

Dictionary使用HashTable主要是为了加快关键字空间的搜索速度。如果在用于字典键的类型上有效地实现GetHashCode(),则字典中的查找在最佳情况下是常数时间,在最坏情况下是线性时间。

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

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

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

如果您需要通过键将项目从集合中取出,请使用HashTable或Dictionary(Dictionary是首选,因为它具有通用性,因此您不会经常对所有内容进行装箱/取消装箱)。

有关解释,请参阅以下链接:

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

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