C#小常識之風趣的類型靜態結構器。本站提示廣大學習愛好者:(C#小常識之風趣的類型靜態結構器)文章只能為提供參考,不一定能成為您想要的結果。以下是C#小常識之風趣的類型靜態結構器正文
這是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編譯器都是分不開的。