1

以下摘录来自 FX Cop 警告。

不访问实例数据或调用实例方法的方法可以标记为静态(在 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");
        }
    }

如果我想myService在 DoSomethingMore 方法中使用,这意味着我不仅必须使该方法成为非静态方法,而且还要使前两个方法成为非静态方法。这似乎很麻烦。

其他人对此有何看法?

4

1 回答 1

5

这似乎很麻烦。

当您考虑在修改方法时整个函数调用链都依赖于一个实例时DoSomethingMore,更改“繁重”的感觉应该变成“必要”。

您应该首先考虑的是您正在编写的方法的语义。当您编写一个方法时,您需要问自己代码应该是实例方法(因为它在语义上应该是与单个实例关联的操作)还是静态方法(对于其他任何东西),并且该决定应该驱动您的编写方式方法。

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

于 2013-02-04T17:01:18.193 回答