以下摘录来自FX警告。
不访问实例数据或调用实例方法的方法可以 被标记为静态(在Visual Basic中共享)。标记后 方法为静态,编译器将发出非虚拟调用站点 这些成员。发出非虚拟呼叫站点将阻止检查 确保当前对象指针所在的每个调用的运行时 非空。这可以带来可衡量的性能提升 性能敏感的代码。在某些情况下,无法访问 当前对象实例表示正确性问题。
我理解如果私有方法不访问实例数据或方法时使私有方法保持静态的性能优势,但我不确定在大多数情况下上述建议是否正常。如果您正在编写极其性能关键的代码,并且您无法选择在c#中编写它,我可以理解这种情绪,但考虑到通常,健壮,易于阅读和易于重构的代码优于性能你真的遵循这个建议吗?
我对私有静态方法的问题是,当你需要重构一个类时,我发现静态方法使得这样做更加困难。如果您有大量静态方法,并且需要更改一个以使用实例变量,并且该方法由其他私有静态方法使用,则最终必须进行更多更改才能使其正常工作。下面是一个例子(请记住这是一个最小的实现,只是为了证明这一点):
public class Test
{
private IService myService;
private static void DoSomething()
{
DoSomethingElse();
}
private static void DoSomethingElse()
{
DoSomethingMore();
}
private static void DoSomethingMore()
{
Console.Write("DO SOMETHING");
}
}
如果我想在DoSomethingMore方法中使用myService
,这意味着我不仅需要使用非静态方法,还要使用前两种方法。这看起来很麻烦。
其他人对此有何看法?
答案 0 :(得分:5)
这看起来很麻烦。
当您认为整个函数调用链在您修改DoSomethingMore
方法时依赖于实例时,变更“负担”的感觉应该变得“必要”代替。
您应该首先考虑的是您正在编写的方法的语义。当你编写一个方法时,你需要问问自己代码是应该是一个实例方法(因为它应该在语义上是一个与单个实例相关的动作),还是一个静态方法(用于其他任何方法),这个决定应该是你写的方式方法。
在生产代码中存在测量性能缺陷之前,您应该根据对您的域有意义的方法制作方法实例或静态,而不是其他任何内容。