【发布时间】:2015-10-01 10:47:12
【问题描述】:
让我们有两个代码sn-ps:
答:
public class Foo
{
private static Bar _unused = new Bar();
}
乙:
public class Foo
{
private static Bar _unused;
static Foo()
{
_unused = new Bar();
}
}
在 A 的情况下,CLR 甚至不会调用 Bar ctor(除非它是调试版本或附加了调试器),但是在 B 的情况下,它会被调用所有情况。
问题在于,在 Bar 构造函数中,可以进行调用,使该实例可从其他地方访问 - 最典型的是 事件订阅。
所以:
- 为什么案例 A 和 B 的评估方式不同?
- 为什么 CLR 在 A 的情况下根本不调用 Bar ctor - 因为它 在 ctor 完成和实例之前不应将其评估为垃圾 被分配到适当的字段?
【问题讨论】:
-
是
Foo曾经在B中使用过吗? -
@HansPassant 在 sn-p A 中,
Foo在 IL 中被标记为beforefieldinit。见this。 -
@Lucas Trzesniewski 感谢您的出色回答!它实际上比接受的更正确(但遗憾的是,无法将 cmets 标记为答案)
标签: c# .net optimization initialization static-members