CLR Via C#可以选择调用构造函数的次数从而来生成执行更快的代码,本文就写一段测试代码来看看究竟怎样。
本文首要对CLR Via C# 静态结构函数的功能进行剖析与比照,笔者用简略的言语描绘了CLR Via C#静态结构函数,希望能给你带来协助。
1 CLR Via C#静态结构函数是私有的(private) ,并且不能人为去修正拜访修饰符。
2 CLR Via C#静态结构函数不该该去调用基类的静态结构函数,由于静态字段不会被承继到子类。
3 CLR Via C#静态结构函数在一个类型中有且仅有一个,并且是无参的。
4 CLR Via C#静态结构函数中只能初始化静态字段。
从上面的***点能够知道静态结构函数都是private的,所以不能显现区进行调用,关于JIT何时会去生成调用静态结构函数的代码。存在着两种说法。一般被称为Precise和BeforeFieldInit。
l Precise方法JIT编译器生成调用的机遇:***创立类型的代码之前;拜访类的非承继字段或成员代码之前。
l BeforeFieldInit方法JIT编译器生成调用的机遇:在拜访费承继静态字段代码之前。
这两种方法的首要差异便是挑选调用静态结构函数的机遇是否是确认的,Precise方法CLR会在确认的时间调用静态结构函数,而BeforeFieldInit方法CLR能够自由挑选调用静态结构函数的机遇,使用这一点,CLR能够依据类型是否在程序域中加载来挑选静态结构函数的调用次数,以便能生成履行更快的代码。
下面来看个类分别用CLR Via C#展示了这两种方法
- publicclassUserPrecise
- {
- publicstaticstring_name="内联赋值:oec2003";
- staticUserPrecise()
- {
- _name="结构函数赋值:oec2003";
- }
- }
- publicclassUserBeforeFieldInit
- {
- publicstaticstring_name="内联赋值:oec2003";
- }
通过IL代码能够看出在UserBeforeFieldInit 的元数据上有BeforeFieldInit的符号,如下图:
已然上面说到BeforeFieldInit方法CLR Via C#能够挑选调用结构函数的次数然后来生成履行更快的代码,下面就写一段测验代码来看看终究怎样。
- publicsealedclassProgram
- {
- staticvoidMain(string[]args)
- {
- constInt32iterations=1000*1000*1000;
- Test1(iterations);
- Test2(iterations);
- }
- privatestaticvoidTest1(Int32iterations)
- {
- Stopwatchsw=Stopwatch.StartNew();
- for(Int32i=0;i
知优网 » 剖析与比照CLR Via C#静态结构函数的功能