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

mez*_*oid 9 c# resharper static function

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

这是我可能拥有的一种方法的大大简化的例子.

private void MakeStatusTheSame(MyClass mc, MySecondClass msc)
{
    mc.Status = msc.Status;
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

sco*_*ttm 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;
}
Run Code Online (Sandbox Code Playgroud)

此外,您可以使它成为一个扩展方法(也是静态的):

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


Bug*_*ter 8

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

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


ove*_*ked 7

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

想象一下调试非静态方法并意识到实例没有被触及.即时气味,如果没有解释功能的说明,你可能会分心于真正的问题.

  • +1表示该方法不应与实例成员进行交互.我绝对希望人们在通过调用实例成员上的方法修改特定代码之前要三思而后行.通过将私有方法标记为静态,如果某人修改了代码以使用实例成员,则会收到编译警告,这至少应该让他们思考几秒钟. (2认同)