ICollection的合同<T> .IsReadOnly

Kon*_*lph 8 .net collections msdn

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

我的班级不允许插入和删除.它不会允许通过修改物品this[int].set属性.

MSDN指出,

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

对于我的班级来说,这似乎意味着我必须返回,true但在我眼中,这使得该属性成为了一个完全没用:据我所见,这种方法的使用方法如下:

客户端处理任意操作,IList并且如果可能的话,需要在其中插入元素.他们可以通过调用Insert和捕获结果来做到这一点NotSupportedException- 由于各种原因,这可能是不可取的.因此,客户可以IsReadOnly事先测试该属性,而不是激发异常.

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

可以肯定的,还有的IList.IsFixedSize属性,但是这是一个独立的类型(IList<T>延伸IList).我该怎么办?还实现IList(我真的喜欢这个替代方案)?做点别的吗?

Luk*_*keH 2

还有其他需要考虑的事情...

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

数组返回falseforIsReadOnlytruefor IsFixedSize

我想我可能会IList另外实现IList<T>然后模仿数组行为,就 和IsReadOnly而言IsFixedSize

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

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

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