【问题标题】:Why doesn't HashSet<T> implement IReadOnlyCollection<T>?为什么 HashSet<T> 不实现 IReadOnlyCollection<T>?
【发布时间】:2013-01-19 12:23:58
【问题描述】:

.NET 4.5 中的新只读接口(例如 IReadOnlyCollection&lt;T&gt;IReadOnlyDictionary&lt;TKey,TValue&gt;)非常有用,尤其是因为它们已在常见的 BCL 类型(例如 Collection&lt;T&gt;List&lt;T&gt;Dictionary&lt;TKey,TValue&gt;)上实现。

但是,HashSet&lt;T&gt;SortedSet&lt;T&gt; 还没有升级为实现 IReadOnlyCollection&lt;T&gt;,我看不出这个决定背后的逻辑,因为这些类在没有任何修改或重大更改的情况下与接口匹配。它只是被 BCL 团队忽略了,还是我在这里遗漏了什么?

(这特别烦人,因为没有内置方法可以将集合包装在 IReadOnlyCollection&lt;T&gt; 中。确实,ReadOnlyCollection&lt;T&gt; 包装 IList&lt;T&gt; 而不是 ICollection&lt;T&gt;。我知道编写自己的包装器是微不足道的。 )

【问题讨论】:

标签: collections .net-4.5 base-class-library


【解决方案1】:

2015 年更新:已在 .NET 4.6 中修复

在集合类型 HashSet、LinkedList、Queue、SortedDictionary、SortedList、SortedSet 和 Stack 上实现了只读接口。 [944715]

https://dotnet2015.blob.core.windows.net/changes/dotnet46-changes.txt

【讨论】:

    【解决方案2】:

    在 4.5 中添加 IReadOnlyXxx 接口的最可能原因是因为它们需要使 .NET 集合在 WinRT 项目(应用商店和电话应用程序)中可用。需要将集合正确映射到 WinRT 的 IVectorView 和 IMapView 接口。这是由 CLR 中内置的语言投影自动完成的。 WinRT 没有等效的 ISet 接口,因此没有必要更改 HashSet。


    更新:在 .NET 4.5.1 中解决了不对称问题,这无疑要感谢大量客户反馈 :),HashSet 现在也实现了 IReadOnlyCollection

    【讨论】:

    • 我完全清楚使用 IReadOnlyCollection 与使用不可变集合的含义(确实是好时机,我昨天用它们做了一些测试!)。我不将它们用作不变性的保证,而是用作“保证非懒惰IEnumerable&lt;T&gt; 有一个计数”,它有它的用途。如果调用者将它们转换回实现的类型,那么我认为这与使用反射修改私有成员一样安全。感谢您提及 WinRT 类型,这似乎是添加这些接口的主要原因。
    • 你甚至不尝试回答问题。
    • 嗯,很确定我做到了。看来朱利安明白了。 WinRT 语言投影本身就值得一本书,在 SO 帖子中写一个不太实用。
    猜你喜欢
    • 2012-08-04
    • 2015-09-25
    • 1970-01-01
    • 1970-01-01
    • 2017-06-10
    • 1970-01-01
    • 2011-04-04
    • 2013-03-25
    • 1970-01-01
    相关资源
    最近更新 更多