【发布时间】:2011-12-29 06:28:06
【问题描述】:
第一次访问静态成员时会执行静态构造函数。知道了这一点,我有几个问题:
- 这是否意味着每次访问静态方法时,运行时都必须检查是否调用了静态构造函数?
- 这会影响性能吗?
- “无构造函数”静态类能否避免这种性能损失?
[编辑]:我想澄清一下,我不关心微优化。
我问这个问题是因为这是一个设计决定。如果静态构造函数导致性能下降,那么我将在设计代码时考虑到这一点,并且会更加了解可能影响性能的决策。
这里有一个例子来说明我的问题。采用Independent 方法并将其放在单独的静态类中会有什么好处吗?这样,它就不必检查静态Test 是否已初始化。 [更新请参阅下面的答案以获得更好、更简单的示例]。
static class Test {
// Static constructor with dependent method:
static int x;
static Test() { x = 5; }
static int Dependent() { return x; }
// Static, independent method:
static int Independent(int y) { return y+1; }
}
Here's the quote 来自关于静态构造函数的 C# 规范:
静态构造函数的执行由第一个触发 在应用程序域中发生以下事件:
- 创建了一个类的实例。
- 类的任何静态成员都被引用。
【问题讨论】:
-
我读过那篇文章,但它肯定与我的问题不同。它比较了类型初始化与静态构造函数的性能。我有兴趣知道静态构造函数是否会减慢访问方法的速度。我重新阅读了“重复”,包括所有答案和链接,但我的问题仍然没有答案!
-
我认为这是在字段访问上,而不是在方法调用上。但是,是的,在某些情况下可能会出现明显的性能下降。
-
@HenkHolterman 我通常批评过早的优化。但是,我对开发良好的设计模式更感兴趣,如果已知静态构造函数会导致性能下降,那么设计可能会导致性能下降的静态方法并不是一个很好的做法。
标签: c# .net performance static static-constructor