Resharper建议将我的私有方法静态作为一个好建议吗?

时间:2009-09-19 02:57:22

标签: c# function static resharper

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

这是我可能拥有的那种方法的一个非常简化的例子。

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

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

我尽量避免使公共方法变得静态,因为它们破坏了单元测试...但我不确定这同样适用于私有方法。

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

4 个答案:

答案 0 :(得分:11)

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

以下是一个例子:

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 */
   }
}

答案 1 :(得分:8)

冒着听起来像逆向的风险,我必须承认我不喜欢将静态方法与实例方法混合;而且我一般不喜欢静态方法。静态方法难以测试,难以覆盖且难以维护。我更喜欢将处理Foo对象的所有静态方法粘贴到单个FooUtils类中 - 或者更好的是,将其粘贴到FooSomethingDoer类的单例实例中。

当然,静态方法在某些情况下非常有意义 - 例如,在创建上述单身人士或工厂等时,我并不是说所有静态方法都是纯粹的邪恶;我希望尽可能避免错误。

答案 2 :(得分:7)

我是这么认为的;看到方法是静态的,这清楚地表明该方法应与任何实例成员进行交互。

想象一下调试一个非静态方法并意识到实例没有被触及。即时嗅觉,如果没有解释该功能的评论,你可能会分心于真正的问题。

答案 3 :(得分:4)

我通常会按照R#的建议去做。这是一个私有方法,所以(希望)你不是在编写单元测试。使其静态显式表明它不使用任何实例成员,这使得检查副作用更容易。