.net 为什么不是';难道没有一个;“设置”;NET框架中的接口?
我具体考虑的是泛型类.net 为什么不是';难道没有一个;“设置”;NET框架中的接口?,.net,collections,interface,set,.net,Collections,Interface,Set,我具体考虑的是泛型类HashSet。它实现了几个接口,但没有一个接口公开集合的正确语义。具体来说,没有一个支持返回bool的Add方法。(ICollection支持void Add,可在紧急情况下使用。)这些接口也不支持常用的集合操作,如并集和交点。(尽管必须指出,其中一些操作可以通过对IEnumerable的扩展来实现) 这意味着该类只能像一个集合一样直接实现。也就是说,你不能这样做: ISet<int> = new HashSet<int>; ISet=新哈希集;
HashSet
。它实现了几个接口,但没有一个接口公开集合的正确语义。具体来说,没有一个支持返回bool
的Add
方法。(ICollection
支持void Add
,可在紧急情况下使用。)这些接口也不支持常用的集合操作,如并集和交点。(尽管必须指出,其中一些操作可以通过对IEnumerable
的扩展来实现)
这意味着该类只能像一个集合一样直接实现。也就是说,你不能这样做:
ISet<int> = new HashSet<int>;
ISet=新哈希集;
至少据我所知不是这样。那么,是什么促使人们选择忽略这一点呢
也许最重要的是:即使您可以将
HashSet
强制转换为ICollection
等,您也会丢失正在公开的API中的语义值。也就是说,API的使用者没有迹象表明他们正在使用一个集合。因此,当你可以调用ICollection.Add
并通过时,如果人们尝试两次添加一个项目但都不起作用,他们会感到困惑。设置接口会给人们带来正确的期望。请查看标准库中缺少的添加此功能的功能。虽然我不确定它为什么没有更早地进入基类库,但.NET 4.0中提供了一个接口,它离发布只有几周的时间。该接口具有在集合上预期的大多数方法。以下是一些受支持的方法:
- 添加、清除、包含、复制到、GetEnumerator、删除(继承)
- 除外
- 相交于
- 发行
- 发行时间
- 重叠
- 联合
和集合实现了这个新的接口。ISet会有什么
ICollection
没有的呢?哦,我想我明白了。。。一个Add
方法,返回一个bool
,呃?@dan-你不能向一个集合中添加重复项。@dan-IsSubsetOf
,UnionWith
,等等。你的意思是什么只用于它的直接实现?声明ICollection的变量/参数,您可以访问add方法。然而,这个契约并没有说它是一个集合,但这并不是因为显式的实现,我甚至没有想到检查它是否在.NET4.0中。我想,如果到目前为止还没有包括在内,那一定是有原因的我将期待着这对未来的项目。