Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 为什么不是';难道没有一个;“设置”;NET框架中的接口?_.net_Collections_Interface_Set - Fatal编程技术网

.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中。我想,如果到目前为止还没有包括在内,那一定是有原因的我将期待着这对未来的项目。