天天看點

C#類的靜态構造函數與C#結構體的靜态構造函數C#類的靜态構造函數結構體的靜态構造方法

C#類的靜态構造函數與C#結構體的靜态構造函數

C#類的靜态構造函數

public static void Test()

{

Class1 class1 = new Class1();

Console.WriteLine(Class1.myInt);

Console.WriteLine(“");

Class2 class2 = new Class2();

class2.myInt = 23;

Console.WriteLine(class2.myInt);

Console.WriteLine("”);

Class3 class3 = new Class3();

}

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

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

    class Class3
    {
        static Class3()
        {
            Console.WriteLine("Hello from myValueType3");
            myInt = 333;
        }
        public static Int32 myInt;
    }
    ![運作結果](https://img-blog.csdnimg.cn/20190711100223710.png)
           

類的靜态構造方法會在所有這個類的調用方法之前觸發

結構體的靜态構造方法

public class Test_StaticClass

{

public static void Test()

{

Class1 class1 = new Class1();

Console.WriteLine(Class1.myInt);

Console.WriteLine(“");

Class2 class2 = new Class2();

class2.myInt = 23;

Console.WriteLine(class2.myInt);

Console.WriteLine("”);

Class3 class3 = new Class3();

}

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

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

    struct Class3
    {
        static Class3()
        {
            Console.WriteLine("Hello from myValueType3");
            myInt = 333;
        }
        public static Int32 myInt;
    }
}
![運作結果](https://img-blog.csdnimg.cn/20190711100428267.png)
           

我們看到雖然三個結構中都有靜态構造器,卻隻有第一個結構的被執行了。事實上,這個有趣的現象也是CLR對性能的考慮,除非類型确實被通路到了,否則永遠不會調用到它的類型構造器,這個過程是JIT的。

當執行到第六行代碼時,CLR嘗試要去Class1查找靜态字段myInt的值。這個時候,Class1才是真正被通路到了。靜态構造器被執行,得到相應的輸出。

而Class2中myInt是個執行個體成員,通路它的值隻關系到執行個體type2執行個體。與類型本身沒有任何關系,CLR不會執行類型Class2的靜态構造器。

Class3跟Class1幾乎是一樣的,myInt是靜态成員,但是在main函數中,Class3還是沒有被真正通路到,隻是利用它構造出了一個虛拟的對象結構,這種對象結構裡面所有字段都被賦予一個0值或者null值,是以第二行輸出為零

這些性質與JIT編譯器都是分不開的。