問題的發現
早上上班,在使用partial修飾類的時候,發現我建立的partial類裡面拼接的字元串居然沒有拼接成功。
代碼如下:
StaticClass.A.cs
StaticClass.B.cs
執行這個代碼,大家猜一猜會出現什麼?”字段A和字段B永遠在一起“???,接下來神奇的來了:
字段B這個渣男神奇的消失了。
問題原因
第一反應,partial類字段不共享。然後試了試直接在StaticClass.A.cs中,将StaticClass.B.cs中的StringB在StaticClass.A.cs中指派一下。然後重新編譯運作,然并卵,還是一樣的結果。
沒有辦法,隻能祭出下一魂技。partial隻是.net2.0的一個文法糖,編譯之後是不會有這個關鍵字的。使用ILSpy編譯一下,看看編譯後的結果。
看到這裡,答案已經基本浮現再我們面前了。
現在我們直接在Main中輸入如下代碼:
class Program
{
internal static string StringA = "字段A";
internal static string StringAB = StringA + StringB + "永遠在一起";
internal static string StringB = "字段B";
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
Console.WriteLine(StringAB);
Console.Read();
}
}
結果輸出:
Hello World!
字段A永遠在一起
得到結論:
同一個類中的靜态變量,是有上下順序的。
總結
上面這個簡單的例子,其實涉及到C#的2大基礎知識。編譯 與 CLR加載
注明:圖檔來源網絡
partial類的編譯
将上面的StaticClass.A.cs修改成StaticClass.C.cs,字段A就可以和字段B愉快的在一起了。
請注意修改的字段名稱,将A改成了C。修改這個字段名稱會改變什麼内容呢。對的,就是檔案的排列順序。
這也就說明了,
C#編譯器 在編譯cs檔案的時候,是按照檔案順序一個一個加載cs檔案的。
CLR加載
CLR并不是開始就加載所有的可能用到的程式集,隻有用到的時候才會去加載。(這個這裡沒有展現,以後碰到具體例子在詳細說明。)
上面的例子,說明了
CLR在加載同一個類的時候,是按照順序,一行一行去加載IL代碼。
類的加載順序除了上面簡單的靜态變量塊,還有很多情況,下次有時間繼續講解。