ICollection合同<t> .IsReadOnly </t>

时间:2009-07-02 09:56:23

标签: .net collections msdn

我正在编写一个实现IList<T>的数组包装器类。我不确定要为IList<T>.IsReadOnly(继承自ICollection<T>)返回什么。

我的课程不允许插入和删除。它 允许通过this[int].set属性修改项目。

MSDN表示

  

在创建集合后,只读集合不允许添加,删除或修改元素。

对于我的班级,这似乎意味着我必须返回true,但在我看来这会使属性 bit 完全无用:据我所知,使用这种方法如下:

客户端处理任意IList并需要在其中插入元素,如果可能的话。他们可以通过调用Insert并捕获生成的NotSupportedException来实现此目的 - 由于各种原因,这可能并不可取。因此,客户端可以事先测试IsReadOnly属性,而不是激发异常。

但是这个属性的结果将是错误,因为它将集合的可修改性与其内容的可修改性混合在一起 - 这是完全不相关的事情

可以肯定的是,IList.IsFixedSize属性是IList<T>属性,但这是一个单独的类型(IList 扩展IList)。我该怎么办?还要实现{{1}}(我真的喜欢这个替代方案)?做点什么吗?

3 个答案:

答案 0 :(得分:2)

我认为,为了满足定义的合同,您必须返回true

您可以(另外)实施IBindingList - 这有AllowNewAllowEditAllowRemove。您将从true返回AllowEdit,从其他两个返回false

然而,调用者是否检查了这一点取决于调用者。但是,很多UI绑定代码都会出现。

加入:

也;如果您正在实施IList,那么 可能会实施IList<T>;特别是,IList对于许多反射和绑定场景非常重要,因为这些场景中的类型是未知的。

答案 1 :(得分:2)

要考虑的其他事情......

您的集合是一个数组包装器,它有一些类似于数组的语义。即,不能插入或删除项目,但可以修改它们。

数组为false返回IsReadOnly,为true返回IsFixedSize

我认为除了IList之外,我可能会实现IList<T>,然后模仿数组行为,就IsReadOnlyIsFixedSize而言。

remark from MSDN中的关键字是“或”:

  

只读的集合不允许添加,删除,   在创建集合后修改元素。

您的收藏 允许修改,因此在我看来,为true返回IsReadOnly会破坏该合同。

答案 2 :(得分:1)

这里,修改的语义很重要。修改集合的元素和修改集合包含的对象之间存在差异。想一想集合中实际空间的元素。您不能在特定空间中添加空格,删除空格或更改对象。这是IsReadOnly遵守的合同。