代码之家  ›  专栏  ›  技术社区  ›  Konrad Rudolph

ICollection<T>的合约。只读

  •  8
  • Konrad Rudolph  · 技术社区  · 17 年前

    我正在编写一个数组包装器类,实现 IList<T> IList<T>.IsReadOnly (继承自 ICollection<T> )不过。

    允许通过以下方式修改项目 this[int].set 财产。

    MSDN 声明

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

    对于我的班级来说,这似乎意味着我必须回去 true 但在我看来,这使得该物业成为

    IList 并且需要将元件插入其中, 如果可能的话 。他们只要打个电话就可以了 Insert 并捕捉结果 NotSupportedException 并且由于各种原因,这可能是不理想的。因此,客户端可以直接测试 IsReadOnly 财产事先。

    但这种财产的结果将是 错误的 !

    当然,有 IList.IsFixedSize 属性,但这是一个单独的类型( IList IList (我真的 不要 像这样的替代品)?做点别的吗?

    3 回复  |  直到 17 年前
        1
  •  2
  •   Marc Gravell    17 年前

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

    数组返回 false 为了 IsReadOnly true 为了 IsFixedSize .

    IList IList<T> 然后模仿数组行为,只要 只读 IsFixedSize 担心。

    关键词在 remark from MSDN

    允许修改,因此返回 为了 只读 在我看来,这将违反合同。

        2
  •  2
  •   LukeH    17 年前

    我认为,为了按照规定履行合同,你必须返回 true .

    您可以(另外)实施 IBindingList -这已经 AllowNew , AllowEdit AllowRemove ,以及 false 从另外两个。

    不过,你的来电者是否会检查这一点取决于来电者。不过,很多UI绑定代码都会。

    也;你 应该 可能实施 IList IList<T> 尤其是,

        3
  •  1
  •   Marcus Griep    17 年前

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