为什么HashSet <T>归因于MayLeakOnAbort,但是Dictionary <K,V>不归属?

Blu*_*kMN 16 .net c# memory sql-server hashset

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

小智 15

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

  • @BlueMonkMN至少(事后看来),`IntersectWith`和其他可以作为扩展方法实现,因此`HashSet <T>`本身是安全的,只有`HashSetExtensions`不会. (4认同)
  • @Servy只要当前私有的字段是内部的,我假设的`HashSetExtensions`类就可以完成`HashSet`方法现在所做的,不是吗? (2认同)