私有静态方法.一般好主意?

Sam*_*les 1 c# oop types

以下摘录来自FX Cop警告.

不访问实例数据或调用实例方法的方法可以标记为static(在Visual Basic中为Shared).将方法标记为静态后,编译器将向这些成员发出非虚拟调用站点.发出非虚拟调用站点将阻止在运行时检查每个调用,以确保当前对象指针为非null.这可以为性能敏感的代码带来可测量的性能提升.在某些情况下,无法访问当前对象实例表示正确性问题.

我理解如果私有方法不访问实例数据或方法时使私有方法静态的性能优势,但我不确定在大多数情况下上述建议是否良好.如果您正在编写极其性能关键的代码,并且您无法选择在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");
        }
    }
Run Code Online (Sandbox Code Playgroud)

如果我想myService在DoSomethingMore方法中使用,这意味着我不仅必须使该方法非静态,而且还必须使用前两种方法.这看起来很麻烦.

其他人对此有何看法?

Ada*_*ras 5

这看起来很麻烦.

当您考虑在修改方法时整个函数调用链依赖于实例时DoSomethingMore,变更"负担"的感觉应该变为"必要".

你应该首先考虑的是你正在编写的方法的语义.当你编写一个方法时,你需要问问自己代码是应该是一个实例方法(因为它应该在语义上是一个与单个实例相关的动作),还是一个静态方法(用于其他任何方法),这个决定应该是你写的方式方法.

在您测量了生产代码中不可接受的性能缺陷之前,您应该根据对您的域有意义的方法创建方法实例或静态,而不是其他任何东西.