beforefieldinit修饰符是干嘛用的

简介:

假设我们有一个类A带有beforefieldinit修饰符(beforefieldinit修饰符是编译器在编译完之后,自动加上的,只能通过反编译工具看)。总的来说,加上beforefieldinit修饰符就意味着“类A会在变量可能被引用的前一刻,提前完成初始化。从理论上,加上beforefieldinit修饰符的类A可能延迟初始化,如果你调用的静态方法没有引用任何静态类变量,JIT就不需要初始化这个类A。

     实际上,类A也可能早早地初始化,即使我们在代码中没有引用到类A中的变量。但这也没什么问题,他可以在可能用到类变量的第一个方法就初始化。打个比方,就好像我们办酒席,我们不可能确认具体有多少人回到,我们只能预先安排多少要多少桌子,多少菜(这就是提前初始化的概念)。比较一下代码段,代码段中的两个类FirstType、SecondType都没有加beforefieldinit修饰符,则那个类先被初始化取决于which变量。

复制代码
 1 public static void DoSomething(bool which)
 2 {
 3     if (which)
 4     {
 5         FirstType.Foo();
 6     }
 7     else
 8     {
 9         SecondType.Bar();
10     }
11 }
复制代码

如果这两个类FirstType、SecondType都有加beforefieldinit修饰符(在C#中默认会加上,除非这个类型实现了静态构造函数,在刚进入DoSomething这个方法的时候,这两个类就会同时被初始化(通常是这样,不能绝对保证),跟which变量无关了。

    这也是为什么我们建议在单例模式中使用静态构造函数的原因。

 

 

本文翻译自http://stackoverflow.com/questions/610818/what-does-beforefieldinit-flag-do


作者:kissazi2 
出处:http://www.cnblogs.com/kissazi2/ 
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

转载:http://www.cnblogs.com/kissazi2/archive/2013/05/25/3098229.html

目录
相关文章
|
4月前
|
XML JavaScript 前端开发
《原型链重置版》一万多字让你读懂JavaScript原型对象与原型链的继承,探秘属性的查找机制! (6)
其实javascript中很多方面都跟原型链有关系,你如果没有弄懂,就等同于没有学会javascript...
32 0
《原型链重置版》一万多字让你读懂JavaScript原型对象与原型链的继承,探秘属性的查找机制! (6)
|
4月前
|
Java 编译器
八股文-Java方法的重载与重写
在 Java 中,重载和重写是两个关键的面向对象编程概念。重载通过方法的参数列表不同来区分同名方法,提供了更灵活的方法调用方式。而重写通过子类重新定义父类中已经存在的方法,实现了多态性的体现,让代码更具可扩展性和维护性。
78 2
八股文-Java方法的重载与重写
|
11月前
|
编译器 C语言 C++
开心档之C++ 修饰符类型
开心档之C++ 修饰符类型
|
Java Python Spring
spring注入静态变量有几种方法?不看的都掉坑里了!
spring注入静态变量有几种方法?不看的都掉坑里了!
|
Java C++ Python
详解Python函数的作用域是干嘛的
Python是静态作用域语言,尽管它自身是一个动态语言。也就是说,在Python中变量的作用域是由它在源代码中的位置决定的,这与C有些相似,但是Python与C在作用域方面的差异还是非常明显的。