我应该将我的私有类方法设为静态吗?

时间:2009-09-03 18:47:42

标签: c# .net asp.net coding-style

是否有最佳实践使类中的私有方法变为静态?我有一个有几种方法的课。其中一些很容易变得静态,因为它们只是处理数据。

我应该让它们静止还是只是保持原样?这更像是一种风格问题吗?是否存在性能因素?

修改 Method can be made static, but should it?

8 个答案:

答案 0 :(得分:37)

如果方法不访问任何类型的状态,那么它们应该是静态的。

静态方法调用提供了比实例方法更高的性能,并且静态方法的存在告诉未来读者您的代码调用此方法将不会在该类型的当前实例的状态中产生副作用。

静态方法的性能提升来自于编译器不必发出callvirt指令来调用静态方法的事实。 callvirt指令对于实例调用很方便,因为它在调用方法之前进行null检查。但是,当您调用静态方法时,不需要检查null,因此编译器可以自由发出更快的call指令,该指令不会检查null

答案 1 :(得分:4)

正如Dan Diplo所说,如果他们可以变得静止,那么它们应该是静态的。这仅适用于私有静态方法(这是您所询问的)。但是,对于公共方法,它们只会混淆您班级的用户。 只有在没有调用者的类实例的情况下使用公共方法时,才应将公共方法设为静态方法,否则不会使它们成为静态的性能损失。

答案 2 :(得分:3)

我一直认为如果它们可以变为静态(并且编译器很快会让你知道它们是否可以),那么它们应该是这样的。有关进一步讨论,请参阅SO duplicate question

答案 3 :(得分:0)

当我确定它们没有任何副作用时,我只会使方法变为静态。

答案 4 :(得分:0)

如果方法不在类中使用任何实例数据,则它应该是静态的。这样很明显,它独立于实例,并且您不必创建实例来调用它。

任何性能差异都不应该成为一个问题。当然,静态方法和实例方法的调用方式不同,但您很可能无法测量任何一致的性能差异。差别很小,有时调用实例方法可能实际上更快,因为指令恰好在执行中更好地排列。

答案 5 :(得分:0)

我同意所有可以是静态的私有方法都应该是静态的。请记住,2之间的性能差异是微不足道的,所以不要这样做以试图提高性能,因为早期优化可能会导致更多的失败而不是成功,直到您确定您遇到性能问题并描述您的应用程序。

答案 6 :(得分:0)

考虑静态方法和多线程。你必须非常小心。 这种观点就像模式定义:“在某种情况下解决问题的方法。” 你不能说“这应该这样做”。这取决于具体情况。

答案 7 :(得分:-1)

如果您的私有方法是静态,那就有点像可能是一个不应该在课堂上的方法根本不应该在一个静态方法库中,这些方法可以被其他类重用。