【问题标题】:Is Resharper's recommendation to make my private method static a good recommendation?Resharper 建议将我的私有方法设为静态是一个很好的建议吗?
【发布时间】:2010-11-29 16:12:53
【问题描述】:

我最近注意到,当我创建私有方法并在传递给它们的对象中设置一些字段时,Resharper 提出了一个提示,说明该方法可以设为静态。

这是我可能使用的那种方法的一个大大简化的示例。

private void MakeStatusTheSame(MyClass mc, MySecondClass msc)
{
    mc.Status = msc.Status;
}

当我有这样的方法时,Resharper 会建议可以将该方法设为静态。

我尽量避免将公共方法设为静态,因为它们会对单元测试造成严重破坏……但我不确定私有方法是否同样适用。

Resharper 的建议是有效的最佳做法,还是我应该将其关闭?

【问题讨论】:

  • 公共方法是完全可测试的,如果它们不会引起副作用。

标签: c# function static resharper


【解决方案1】:

冒着听起来像个逆势而为的风险,我不得不承认我不喜欢将静态方法与实例方法混为一谈。我一般不喜欢静态方法。静态方法难以测试、难以覆盖和难以维护。我更喜欢将处理 Foo 对象的所有静态方法粘贴到单个 FooUtils 类中——或者更好的是,粘贴到 FooSomethingDoer 类的单例实例中。

当然,静态方法在某些情况下非常有意义——例如,在创建上述单例或工厂等时。我并不是说所有静态方法都是由纯粹的邪恶组成的;我只是宁愿在可能的情况下避免它们。

【讨论】:

  • 我和你在一起。我只在有意义时才将方法设为静态,而不仅仅是因为我“可以”。
  • 我同意公开的、受保护的和内部的——但不同意私有方法。如果 Utils 类是代码异味,网上有一些讨论;我建议小心使用它们。
  • 同意。将方法设为静态是尝试传达与该方法的使用相关的信息。让一切都静止是没有意义的。
【解决方案2】:

我认为这绝对是静态方法的主要候选者。它不会改变任何类的属性、字段等。

这是一个例子:

class MyClass
{
  public static void MakeStatusTheSame(MyClass mc, MySecondClass msc)
  {
     mc.status = msc.status;
  }

  private void MakeStatusTheSame(MySecondClass msc)
  {
    this.status = msc.status;
  }

  private int status;
}

此外,您可以将其设为扩展方法(也可以是静态的):

public static class Extensions
{
  public static MyClass MakeStatusTheSame(this MyClass mc, MySecondClass msc)
  {
    mc.status = msc.status
    return mc; /* make the method chainable */
   }
}

【讨论】:

    【解决方案3】:

    我通常会接受 R# 的建议。这是一种私有方法,因此(希望)您不会针对它编写单元测试。将其设为静态明确表示它不使用任何实例成员,这样更容易检查副作用。

    【讨论】:

      【解决方案4】:

      我想是的;看到一个方法是静态的,这清楚地表明该方法应该与任何实例成员交互。

      想象一下调试一个非静态方法并意识到实例没有被触及。立即闻到气味,如果没有注释解释该功能的作用,您可能会从真正的问题上分心。

      【讨论】:

      • +1 用于明确该方法不应与实例成员交互。我绝对希望人们在通过调用实例成员的方法来修改特定代码之前三思而后行。如果有人修改代码以使用实例成员,通过将私有方法标记为静态,他们会收到编译警告,这至少应该让他们思考几秒钟。
      • 几分钟前我有 R# 建议将方法设为静态,但在尝试访问实例字段时发现编译错误。不过,这是第一次发生,一定是有什么东西弄糊涂了。
      • 互动是什么意思?修改价值观?或者这包括读取值?
      • @guiomie,这些操作中的任何一个。例如,String.IsNullOrEmpty() 将其使用的数据作为参数,而不是使用实例成员值。
      猜你喜欢
      • 1970-01-01
      • 2013-11-17
      • 1970-01-01
      • 2019-03-09
      • 1970-01-01
      • 1970-01-01
      • 2014-06-26
      • 2011-05-24
      • 1970-01-01
      相关资源
      最近更新 更多