繁体   English   中英

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

[英]Should I make my private class methods static?

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

我应该让它们静止还是只是保持原样? 这更像是一种风格问题吗? 有性能考虑吗?

编辑: 方法可以做成静态,但应该吗?

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

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

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

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

我总是认为如果它们可以被静态化(并且编译器很快会让你知道它们是否可以),那么它们应该是这样的。 有关进一步的讨论,请参阅SO上的重复问题

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

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

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

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

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

如果你有一个静态私有方法,那就好像它可能是一个根本不应该在类中的方法,而应该是一个静态方法库,可以被其他类重用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM