c# - 为什么 HashSet<T> 归因于 MayLeakOnAbort,但 Dictionary<K,V> 没有?

标签 c# sql-server memory hashset sqlclr

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

最佳答案

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

关于c# - 为什么 HashSet<T> 归因于 MayLeakOnAbort,但 Dictionary<K,V> 没有?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23140885/

相关文章:

c# - 将 Oculus Unity Integration 升级到 v12 后,传送无法在 Quest 上运行

c# - 为什么这个 MVC 路由不起作用?

c# - 使用 C++ 和 C# 的 Visual Studio 2017 单元测试以及未发现的 C++ 测试

c# - 无法使用 Response.Redirect 调用不同页面 ("url",false)

java - 如何从 hibernate 中的存储过程中获取输出值(SQL SERVER)

sql-server - 在 SQL 中分组

SQL Server : Columns to Rows

c++ - c++多线程应用程序上的内存损坏

.net - 生成报告时诊断 .NET OutOfMemoryException

memory - 在 Forth 中使用 HERE 作为临时空间