实例中的静态方法

时间:2014-11-12 11:45:57

标签: c# static-code-analysis

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

这不意味着性能问题吗?当然这不会是那么大的交易,但我仍然对此感兴趣。

3 个答案:

答案 0 :(得分:3)

不,它没有那样的工作。

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

Here is an in-depth article about CLR runtime type handling.特别是,请查看有关MethodTable和Method Slot Table的信息。

Here's another good article from Joe Duffy.它没有明确地谈论静态方法,但它确实解释了如何在最低(汇编程序)级别进行方法调用,因此您将能够看到为什么静态方法调用是高效。

答案 1 :(得分:1)

关于静态方法与实例方法的性能比较的好帖子:Performance of static methods vs instance methods

TLDR:

  • 大多数情况下,实例与静态的性能成本低于 可以忽略不计。
  • 通常会有滥用费用的地方 例如静态,反之亦然。如果你不把它作为你的一部分 静态和实例之间的决定,你更有可能获得 正确的结果。

  • 在极少数情况下,静态泛型方法在另一种类型中 与实例泛型方法相比,创建的类型更少 可以使它有时很少转向很少使用 (并且“很少”指的是它在生命周期中使用的类型 应用程序,而不是它被称为的频率)。一旦你得到他的东西 在那篇文章中你会发现它与100%无关 无论如何,大多数静态vs实例决策。

答案 2 :(得分:1)

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

NonstaticClass.TheStaticMethod();

相反,如果这个

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

这是因为查找和运行静态方法所需的开销要少于类实例上的非静态方法。