class Class1
    {
        public static readonly int max;
        static Class1()
        {
            max = 1;
            Console.WriteLine(max);
        }
     }
/*这是一个类的静态构造函数
Class1 c1 = new Class1();之后这个构造函数就会执行一次*/
    struct jiegou
    {
        public static int a = 1;
        public static int b = 2;
        static jiegou()
        {
            //a = c;
            //b = d;
            Console.WriteLine(a);
            Console.WriteLine(b);
        }
    }
//这是一个结构的静态构造函数
jiegou jg = new jiegou();之后为什么没有输出a和b??

解决方案 »

  1.   

    struct和class的静态构造函数的触发规则是不同的,不像class在第一次使用类的时候触发静态构造函数。如果只访问struct实例的字段是不会触发静态构造函数调用的。通过测试发现当访问静态字段,struct本身的函数(静态和实例)和带参数的构造函数就会引起静态构造函数的执行。而调用默认构造和未覆写的基类虚函数是不会的。为什么呢?
        让我们先来看看class和struct在调用构造函数时的区别。class使用newobj指令而struct使用initobj指令来构造对象。newobj在堆上申请一块内存并调用相应的构造函数进行初始化,然后将对象地址返回给计算栈。initobj则是从本地变量表中载入已经分配出来的struct实例然后初始化struct的各字段。这个初始化过程是CLR内部执行的,而不像class编译器会给class添加一个默认构造函数(这就是为什么struct不能给字段添加默认值的原因。但在类中如果给字段添加了默认值编译器就会自动在构造函数中添加字段赋值操作)。如果给struct中定义了一个有参数的构造函数,那么系统就不会使用initobj指令,而是直接用call指令调用带参数的构造函数。
      

  2.   

    呵呵~看来是我的思路想歪了呢,我在想如果我需要使用一个结构来存放一个全局变量那么该怎么做,我一直在构造函数这饶圈子,想着在构造函数中赋值该变量,但是这却是没有必要的,唉唉~~明明可以直接"结构名.变量=XXXX"这样就好了嘛~汗……