【问题标题】:Using Queryable instead of Extension Method使用可查询而不是扩展方法
【发布时间】:2012-10-16 21:13:07
【问题描述】:

ReSharper 建议我进行以下更改:

发件人:

foreach (var item in db.Proposta.GroupBy(x => x.StatusProposta.Nome))
{
    ...
}

收件人:

foreach (var item in Queryable.GroupBy(db.Proposta, x => x.StatusProposta.Nome))
{
    ...
}

消息是:将方法“GroupBy”作为静态方法调用

我正在使用 Entity Framework 并且 db 是我的上下文。

我想知道通过这样的改变我可以得到什么好处或可以避免什么问题。

【问题讨论】:

  • 您使用的是旧版本的 ReSharper,它不了解扩展方法吗?
  • 这些调用是等价的。我会留下原来的。考虑到 GroupBy 已经是一种扩展方法,另一个感觉很尴尬 - 并且通过允许向该类型添加方法来创建扩展方法来扩展一种类型。换句话说 - 扩展方法的想法是允许使用新添加的方法来调用该类型上已经存在的其他方法。
  • @TrevorPilley 我使用的是最新版本,7.0。刚刚安装好了。
  • 请参阅 my answer here 以回答您的开头“ReSharper 已向我提出建议”。简而言之,铅笔图标是它可以做的事情;灯泡图标是它想要做的事情。
  • @AakashM 很有启发性!但在这种情况下,我看到的是一把锤子,而不是铅笔或灯泡。

标签: c# linq entity-framework resharper


【解决方案1】:

Resharper 只是提供它作为它可以为您做的事情。它还将提供将静态方法调用转换为扩展方法调用的功能。

实际上这是一个偏好问题 - 没有一个优于另一个的优势 - 它们编译为相同的东西,但您应该将它用作扩展方法。在使用 LINQ 时,将扩展方法语法用于扩展方法而不是简单的静态调用更为流行。

【讨论】:

    【解决方案2】:

    来自Extension Methods (C# Programming Guide)

    在您的代码中,您使用实例方法调用扩展方法 句法。然而,中间语言(IL)由 编译器将您的代码转换为对静态方法的调用。 因此,封装的原理并不是真正的被 违反。实际上,扩展方法不能访问私有变量 在他们扩展的类型中。

    【讨论】:

      猜你喜欢
      • 2015-03-12
      • 2019-12-07
      • 1970-01-01
      • 2011-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多