【问题标题】:IEnumerable & Good Practices (& WCF)IEnumerable & Good Practices (& WCF)
【发布时间】:2023-04-05 00:57:01
【问题描述】:

当您不需要实际添加删除事物而只枚举它们时,在应用程序范围内使用IEnumerable是一个好习惯吗?

附带问题:你有没有遇到过从 WCF 服务返回 IEnumerable<T> 的问题?这会对客户端应用程序造成问题吗?毕竟,我认为那会被序列化为一个数组。

【问题讨论】:

  • 也许您应该添加您正在谈论的语言?毕竟,这不是一个仅限 .net 的网站...
  • 虽然这不是完全重复的,但我仍然建议你看看这个问题:stackoverflow.com/questions/1072614/…

标签: c# .net wcf ienumerable


【解决方案1】:

当我想向调用者提示实现可能使用惰性求值时,我倾向于只返回IEnumerable<T>。否则,我通常会返回 IList<T>ICollection<T>,如果结果应该是只读的,则将其实现为 ReadOnlyCollection<T>

延迟评估可能是一个重要的考虑因素:如果您的实现可以抛出异常,则在调用者开始枚举结果之前不会抛出异常。通过返回IList<T>ICollection<T>,您保证在调用该方法时会抛出任何异常。

在 WCF 方法的情况下,从使用惰性求值的方法返回 IEnumerable<T> 意味着在您的响应被序列化之前可能不会引发任何异常 - 减少了在服务器端处理它的机会。

【讨论】:

    【解决方案2】:

    我没有任何良好实践来源,但我经常倾向于依赖 List 来收集我的集合,它实现了 IEnumerable,但我确实将它作为 List 而不是 IEnumerable 传递,如果我需要它是只读的我宁愿通过 ReadOnlyCollection..

    【讨论】:

      【解决方案3】:

      我不喜欢返回或接受IList<T>List<T>,因为它们暗示了修改集合的能力。

      所以更喜欢将T[] 作为固定大小的集合返回。数组也可以轻松映射到任何其他框架、平台等。

      并且更愿意接受IEnumerable<T> 以强调一个方法将枚举该集合。

      【讨论】:

      • T[] 不是只读集合:您可以修改数组的元素。相反, IList 并不意味着能够修改集合 - 例如对于 ReadOnlyCollection,IList.IsReadOnly 为真。如果调用者不修改返回的集合很重要,最好返回 IList 并实现为不可变对象的 ReadOnlyCollection
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-14
      • 2010-09-26
      • 1970-01-01
      • 1970-01-01
      • 2012-12-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多