代码之家  ›  专栏  ›  技术社区  ›  HCL

为实现INotifyCollectionChanged的集合返回IEnumerable<T>是一种好的做法吗

  •  3
  • HCL  · 技术社区  · 16 年前

    写另一个问题,所以,我来到了一个模式,我经常使用,我从来没有真正思考。但现在,我不再确定这是不是正确的方法:

    如果我有我的WPF控件将绑定到的集合,我几乎总是返回 IEnumerable<SomeType> ReadOnlyObservableCollection<SomeType> . 我从来没有遇到过这样的问题,所有的消费控件总是正确更新,这并不奇怪,因为它们检查 INotifyCollectionChanged -接口。

    但我现在的问题是,如果这是一个坏的做法,声明在签字只 IEnumerable<SomeType> 但回报(也依赖)更强大的东西( inotifyCollection已更改

    更新:

    我试图澄清:

    我的主要目的是归还 . 但大多数时候,他们回来了 IEnumerable<SomeType> 工具也 inotifyCollection已更改 例如

    也许我应该问:是否有一个接口确切地包含IEnumerable和INotifyPropertyChanged。

    5 回复  |  直到 16 年前
        1
  •  4
  •   Reed Copsey    16 年前

    IEnumerable<T> INotifyCollectionChanged

    ObservableCollection<T> 这(间接通过 Collection<T> IList<T> 以及其他接口。

    如果您正在创建自己的自定义集合,并计划将其与数据绑定一起使用,我会让它实现 (或潜在的) IList<T> ,如果合适)和 inotifyCollection已更改 . 这将为它提供最佳的可用性,无论是从代码方面,还是从高效绑定方面。


    也就是说,我经常做你想做的事,但这不是一个“硬”依赖。相反,我使用 ,和 inotifyCollection已更改 -如果它被实现了,就利用它。但是,如果“辅助”接口不存在,我允许代码工作。

        2
  •  2
  •   AllenG    16 年前

    我倾向于认为如果 INotifyCollectionChanged IEnumerable 这很像是回来 Object MemoryStream. 当然,您可以转换回所需的类型,但是如果稍后出现某个类型,请参见的返回类型 I可数 并编写与该返回匹配但不实现的代码 inotifyCollection已更改

        3
  •  2
  •   Mark Byers    16 年前

    返回一个最小的接口而不是一个更丰富的接口通常是一个好主意。如果你有一个丰富的界面,那么有更多的东西需要测试,也有更多的东西会出错。这也意味着,如果您想避免破坏性的更改,那么在可预见的将来,您必须始终支持所有这些额外的特性。这使得以后更难修改实现。

    然而,依赖接口不能保证的东西是一种不好的做法。如果有一天你没有 ObservableCollection 但是如果是其他类型的集合,那么代码将在运行时而不是编译时失败。

        4
  •  1
  •   STO    16 年前

    忘记WPF的数据绑定,然后决定什么是最好的回报, IEnumerable<T> 或更多混凝土类型。由于WPF使用反射来确定如何绑定到指定集合的最佳方式,因此您不必担心。

        5
  •  0
  •   Lightman    11 年前

    如果这是一种不好的做法,只在签名中声明 IEnumerable<SomeType> INotifyCollectionChanged

    选择返回值类型是为了允许值使用者在不进行不安全类型转换的情况下使用值。

    1. 如果 IEnumerable 则值使用者不应假设它是一个集合,还是一个可以更改的集合,或者是一个可以更改并可以通知其更改的集合。

    唯一的方法 I可数

    1. 如果 ReadOnlyObservableCollection

    只读可观察集合

    回来是个好习惯 I可数 接口。

    I可数 作为 INotifyPropertyChanged 转换 I可数 或者更复杂的事情。

    是否有一个接口完全包含 I可数 InotifyProperty已更改

    ,仅类 .

    推荐文章