8

我正在编写一个实现IList<T>. 不过,我不确定要返回什么IList<T>.IsReadOnly(继承自ICollection<T>)。

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

MSDN指出_

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

对于我的班级,这似乎意味着我必须返回true,但在我看来,这使得该物业成为少量完全没用:据我所知,这种方法的使用如下:

客户端处理任意IList并需要在其中插入一个元素,如果可能的话。他们可以通过调用Insert并捕获结果来做到这一点NotSupportedException——出于各种原因,这可能是不可取的。IsReadOnly因此,客户端可以预先测试属性,而不是引发异常。

但是这个属性的结果是错误的,因为它混合了集合的可修改性和内容的可修改性——这是完全不相关的事情

可以肯定的是,有IList.IsFixedSize属性,但这是一个单独的类型(IList<T>扩展)。我该怎么办?也实施(我真的喜欢这种选择)?做点别的吗?IListIList

4

3 回答 3

2

我认为要满足定义的合同,您必须退货true

您可以(另外)实现IBindingList- 这有AllowNew,AllowEditAllowRemove. 您将从trueAllowEditfalse其他两个返回。

不过,您的来电者是否对此进行检查取决于来电者。但是,很多 UI 绑定代码会。

添加:

还; 如果您正在实施,您可能应该实施;特别是,对于许多反射和绑定场景很重要,在这些场景中,类型不是提前知道的。IListIList<T>IList

于 2009-07-02T10:07:10.487 回答
2

还有什么要考虑的...

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

数组返回falseforIsReadOnlytruefor IsFixedSize

我想我可能会实施IListIList<T>然后模仿阵列行为,就IsReadOnlyIsFixedSize而言。

MSDN评论中的关键词是“或”:

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

在我看来,您的收藏确实允许修改,因此返回trueIsReadOnly违反该合同。

于 2009-07-02T14:44:27.540 回答
1

在这里,修改的语义很重要。修改集合的元素和修改集合所包含的对象是有区别的。想想集合中实际空间的元素。您不能添加空格、删除空格或更改某个空间中的对象。这就是IsReadOnly遵守的合同。

于 2009-07-11T03:27:49.570 回答