C#小知识之有趣的类型静态构造器

所属分类: 软件编程 / C#教程 阅读数: 39
收藏 0 赞 0 分享

这是C#中一个有趣的现象,也许您从中可以窥见些许CLR在构造类型时的行为,以及JIT编译的触发式编译过程。

看下面一段代码:

复制代码 代码如下:

class Program
    {
        static void Main()
        {
            myValueType1 type1 = new myValueType1();
            Console.WriteLine(myValueType1.myInt);
            Console.WriteLine("**********************");
            myValueType2 type2 = new myValueType2();
            type2.myInt =23;
            Console.WriteLine(type2.myInt);
            Console.WriteLine("**********************");
            myValueType3 type3 = new myValueType3();
        }
    }

    struct myValueType1
    {
        static myValueType1()
        {
            Console.WriteLine("Hello from myValueType1");
           // myInt = 111;
        }
        public static Int32 myInt;
    }

    struct myValueType2
    {
        static myValueType2()
        {
            Console.WriteLine("Hello from myValueType2");
        }
        public Int32 myInt;
    }

    struct myValueType3
    {
        static myValueType3()
        {
            Console.WriteLine("Hello from myValueType3");
            myInt = 333;
        }
        public static Int32 myInt;
    }

这里定义了三个结构:myValueType1,myValueType2,myValueType3。三个结构均带静态构造器,在构造器中都有一句用来输出的的代码。在myValueType1和myValueType3的静态。然后我们在main函数里面分别new 了相应的三个实例。您可以先想想输出的结果应该是怎样的。
 事实上您会得到如下的结果:

 我们看到虽然三个结构中都有静态构造器,却只有第一个结构的被执行了。事实上,这个有趣的现象也是CLR对性能的考虑,除非类型确实被访问到了,否则永远不会调用到它的类型构造器,这个过程是JIT的。

当执行到第六行代码时,CLR尝试要去myValueType1查找静态字段myInt的值。这个时候,myValueType1才是真正被访问到了。静态构造器被执行,得到相应的输出。
而myValueType2中myInt是个实例成员,访问它的值只关系到实例type2实例。与类型本身没有任何关系,CLR不会执行类型myValueType2的静态构造器。

myValueType3跟myValueType11几乎是一样的,myInt是静态成员,但是在main函数中,myValueType3还是没有被真正访问到,只是利用它构造出了一个虚拟的对象结构,这种对象结构里面所有字段都被赋予一个0值或者null值,所以第二行输出为零
这些性质与JIT编译器都是分不开的。

更多精彩内容其他人还在看

winform用datagridview制作课程表实例

这篇文章主要介绍了winform用datagridview制作课程表的方法,实例分析了WinForm实现课程表的结构、数据库及调用技巧,需要的朋友可以参考下
收藏 0 赞 0 分享

C#中winform控制textbox输入只能为数字的方法

这篇文章主要介绍了C#中winform控制textbox输入只能为数字的方法,包括使用keyPress事件限制键盘输入以及TextChanged事件限制粘贴等情况,来实现控制输入为数字的功能,需要的朋友可以参考下
收藏 0 赞 0 分享

C#省份城市下拉框联动简单实现方法

这篇文章主要介绍了C#省份城市下拉框联动简单实现方法,涉及字典的定义与索引的用法,是非常实用的技巧,需要的朋友可以参考下
收藏 0 赞 0 分享

C#处理MySql多个返回集的方法

这篇文章主要介绍了C#处理MySql多个返回集的方法,实现了对处理MySql多个返回集进行封装,是非常实用的技巧,需要的朋友可以参考下
收藏 0 赞 0 分享

C#无限参数的写法

这篇文章主要介绍了C#无限参数的写法,通过循环遍历再结合paras.Add方法实现无限参数的功能,是比较实用的技巧,需要的朋友可以参考下
收藏 0 赞 0 分享

C#反射应用实例

这篇文章主要介绍了C#反射应用,实例分析了通过反射实现多系统数据库的配置方法,是比较实用的技巧,需要的朋友可以参考下
收藏 0 赞 0 分享

C#窗体传值实例汇总

这篇文章主要介绍了C#窗体传值,实例形式汇总了静态变量传值、委托传值、对话框之间的传值等常见应用技巧,需要的朋友可以参考下
收藏 0 赞 0 分享

C#把数组中的某个元素取出来放到第一个位置的实现方法

这篇文章主要介绍了C#把数组中的某个元素取出来放到第一个位置的实现方法,涉及C#针对数组的常见操作技巧,非常具有实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C#中Equality和Identity浅析

这篇文章主要介绍了C#中Equality和Identity浅析,本文先是讲解了Equality和Identity的定义,同时讲解了判断两个对象等价性的4种方法,需要的朋友可以参考下
收藏 0 赞 0 分享

在Linux上运行C#的方法

这篇文章主要介绍了在Linux上运行C#的方法,实例分析了Linux平台下Mono软件包的应用技巧,以及在此基础之上的C#运行方法,具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多