我最近注意到,当我创建私有方法,在传递给它们的对象中设置一些字段时,Resharper会提示一个提示,说明该方法可以是静态的。
这是我可能拥有的那种方法的一个非常简化的例子。
private void MakeStatusTheSame(MyClass mc, MySecondClass msc)
{
mc.Status = msc.Status;
}
当我有这样的方法时,Resharper会建议该方法可以是静态的。
我尽量避免使公共方法变得静态,因为它们破坏了单元测试...但我不确定这同样适用于私有方法。
Resharper的建议是否是有效的最佳做法,还是应该将其关闭?
答案 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#的建议去做。这是一个私有方法,所以(希望)你不是在编写单元测试。使其静态显式表明它不使用任何实例成员,这使得检查副作用更容易。