【问题标题】:Why linq extension methods return concrete type [duplicate]为什么linq扩展方法返回具体类型[重复]
【发布时间】:2017-09-13 10:31:47
【问题描述】:

我知道在方法签名中声明接口类型而不是具体类型的好处。我们可以在这里找到很多解释,我不会列出它们,这不是我的问题的重点。

我的问题是关于 linq。为什么,当我们看到在 API 的方法签名中声明接口类型是一种更好的做法时,一些 linq 扩展方法正在返回具体类型?

例如:

  • ToList() 返回 List<> 而不是 IList<>
  • ToDictionary() 返回 Dictionary<> 而不是 IDictionary<>

我想知道,因为我打算用我自己的扩展 Enumerable 扩展方法,而当我记得 linq 声明具体实现时,我的好习惯告诉我声明接口类型。

那我该怎么办?声明具体类型还是接口类型?

【问题讨论】:

  • 我敢说,接受最通用的类​​型以提供一些功能并返回可以返回的最专业的类型(不干扰可能的实现更改)实际上是一种很好的做法。
  • 想象ToList() 将返回IList。在尝试修改返回的列表之前,您真的会为每个返回的 IList 检查IList.IsReadOnly 吗?提示:如果它返回 IList 而没有更具体的合同,你应该这样做。

标签: c# linq


【解决方案1】:

IList 和 IDictionary 是这些类型在其定义中应包含的接口(蓝图),而不是可用于类实例的实现。

因为您特别要求一个列表(使用 ToList)或字典(使用 ToDictionary),所以您将获得一个实际的 List/Dictionary 实例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-08
    • 2020-02-24
    • 1970-01-01
    • 2017-03-19
    • 1970-01-01
    • 2011-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多