我正在编写一个实现IList<T>
的数组包装器类。我不确定要为IList<T>.IsReadOnly
(继承自ICollection<T>
)返回什么。
我的课程不允许插入和删除。它 允许通过this[int].set
属性修改项目。
MSDN表示
在创建集合后,只读集合不允许添加,删除或修改元素。
对于我的班级,这似乎意味着我必须返回true
,但在我看来这会使属性 bit 完全无用:据我所知,使用这种方法如下:
客户端处理任意IList
并需要在其中插入元素,如果可能的话。他们可以通过调用Insert
并捕获生成的NotSupportedException
来实现此目的 - 由于各种原因,这可能并不可取。因此,客户端可以事先测试IsReadOnly
属性,而不是激发异常。
但是这个属性的结果将是错误,因为它将集合的可修改性与其内容的可修改性混合在一起 - 这是完全不相关的事情!
可以肯定的是,IList.IsFixedSize
属性是IList<T>
属性,但这是一个单独的类型(IList
不扩展IList
)。我该怎么办?还要实现{{1}}(我真的不喜欢这个替代方案)?做点什么吗?
答案 0 :(得分:2)
我认为,为了满足定义的合同,您必须返回true
。
您可以(另外)实施IBindingList
- 这有AllowNew
,AllowEdit
和AllowRemove
。您将从true
返回AllowEdit
,从其他两个返回false
。
然而,调用者是否检查了这一点取决于调用者。但是,很多UI绑定代码都会出现。
加入:
也;如果您正在实施IList
,那么 可能会实施IList<T>
;特别是,IList
对于许多反射和绑定场景非常重要,因为这些场景中的类型是未知的。
答案 1 :(得分:2)
要考虑的其他事情......
您的集合是一个数组包装器,它有一些类似于数组的语义。即,不能插入或删除项目,但可以修改它们。
数组为false
返回IsReadOnly
,为true
返回IsFixedSize
。
我认为除了IList
之外,我可能会实现IList<T>
,然后模仿数组行为,就IsReadOnly
和IsFixedSize
而言。
remark from MSDN中的关键字是“或”:
只读的集合不允许添加,删除, 或在创建集合后修改元素。
您的收藏 允许修改,因此在我看来,为true
返回IsReadOnly
会破坏该合同。
答案 2 :(得分:1)
这里,修改的语义很重要。修改集合的元素和修改集合包含的对象之间存在差异。想一想集合中实际空间的元素。您不能在特定空间中添加空格,删除空格或更改对象。这是IsReadOnly
遵守的合同。