实例中的静态方法

本文关键字:静态方法 实例 | 更新日期: 2023-09-27 18:30:04

直接的问题:如果我运行代码分析,它会告诉我即使在非静态类中也要使方法保持静态。据我所知,静态方法是JITed,并在堆中的Type对象上运行。那么,在非静态类中使方法静态不是意味着实例必须在堆中搜索类型对象并在那里运行方法吗?

这难道不意味着性能问题吗?当然这没什么大不了的,但我仍然对此感兴趣。

实例中的静态方法

不,它不是那样工作的。

静态方法实际上(不知不觉地)比非静态方法更有效,因为(A)它没有一个隐藏的"this"指针传递给它,(b)因为它是静态的,框架不必对它的虚拟化做任何事情(当然,最后一点也适用于非虚拟成员方法)。

下面是一篇关于CLR运行时类型处理的深入文章。特别是,查看那里关于MethodTable和Method Slot Table的信息。

这是乔·达菲的另一篇好文章。它没有明确地谈论静态方法,但它确实解释了如何在最低(汇编程序)级别进行方法调用,因此您将能够了解为什么静态方法调用是有效的。

关于静态方法与实例方法性能比较的好文章:静态方法与示例方法的性能

TLDR:

  • 大多数情况下,实例与静态的性能成本如下可忽略不计
  • 你滥用的地方通常会产生什么成本例如静态,反之亦然。如果你不把它作为你的一部分在静态和实例之间进行决策时,您更有可能得到正确的结果。

  • 在极少数情况下,另一种类型中的静态泛型方法导致创建的类型少于实例泛型方法,这使得它有时会有一个小好处,那就是很少使用("很少"指的是在应用程序,而不是调用频率)。一旦你了解了他在那篇文章中,你会发现它与无论如何,大多数静态与实例决策。

我认为重点是,您不是在实例上调用静态方法,而是在类本身上调用。任何不直接依赖实例信息的方法都可以(也应该基于代码分析)标记为静态,然后这样调用:

NonstaticClass.TheStaticMethod();

相反,如果这个

NonstaticClass inst = new NonstaticClass();
inst.TheStaticMethod();

这是因为与类实例上的非静态方法相比,查找和运行静态方法所需的开销更少。