C# 为什么.NET4中的BeforeFieldInit行为发生了变化?

C# 为什么.NET4中的BeforeFieldInit行为发生了变化?,c#,.net,.net-4.0,clr,clr4.0,C#,.net,.net 4.0,Clr,Clr4.0,在C#4中,没有beforefieldinit标志的类型的行为发生了改变,因此现在类型初始值设定项可以在首次使用类的任何静态字段之前调用 我的问题是为什么C#/.NET团队改变了这种行为?主要原因是什么?你能举例说明这种改变有什么意义吗 这种行为一直都在文献记载的范围内——只是在.NET4中它从渴望变为懒惰 我怀疑JIT团队设法找到了一种方法,使其在没有性能损失的情况下变得懒惰。。。或者它可能有助于其他地方的性能。这可能只是.NET 4 CLR与.NET 2 CLR之间行为上的一种变化。。。碰巧

在C#4中,没有beforefieldinit标志的类型的行为发生了改变,因此现在类型初始值设定项可以在首次使用类的任何静态字段之前调用


我的问题是为什么C#/.NET团队改变了这种行为?主要原因是什么?你能举例说明这种改变有什么意义吗

这种行为一直都在文献记载的范围内——只是在.NET4中它从渴望变为懒惰

我怀疑JIT团队设法找到了一种方法,使其在没有性能损失的情况下变得懒惰。。。或者它可能有助于其他地方的性能。这可能只是.NET 4 CLR与.NET 2 CLR之间行为上的一种变化。。。碰巧我注意到了,但我怀疑其他人是否注意到了。我认为JIT团队在他们认为合适的情况下,在文档化的保证范围内调整事情是完全合理的


最终,如果这导致代码失败,那么您已经有了一个bug。

Reference?你在哪里读到的?我在这里读到的:在我的发言中,主要原因是扩展方法的性能?你怎么看?没关系。这些东西没有记录是有原因的。谢谢你的回答!你知道JIT编译器是如何调用initialazers类型的吗?它是否编译两次带有initializer类型调用的方法?我的意思是,在第一次调用之前,当方法执行时,我缺少性能,但第二次调用的方法具有正常性能。@Smeley:老实说,我不知道。我希望会有一些恶作剧发生,但我总是把细节留给JIT团队:)