天天看點

C#--神奇的靜态變量

問題的發現

早上上班,在使用partial修飾類的時候,發現我建立的partial類裡面拼接的字元串居然沒有拼接成功。

代碼如下:

StaticClass.A.cs

C#--神奇的靜态變量

StaticClass.B.cs

C#--神奇的靜态變量
C#--神奇的靜态變量

執行這個代碼,大家猜一猜會出現什麼?”字段A和字段B永遠在一起“???,接下來神奇的來了:

C#--神奇的靜态變量

字段B這個渣男神奇的消失了。

問題原因

第一反應,partial類字段不共享。然後試了試直接在StaticClass.A.cs中,将StaticClass.B.cs中的StringB在StaticClass.A.cs中指派一下。然後重新編譯運作,然并卵,還是一樣的結果。

沒有辦法,隻能祭出下一魂技。partial隻是.net2.0的一個文法糖,編譯之後是不會有這個關鍵字的。使用ILSpy編譯一下,看看編譯後的結果。

C#--神奇的靜态變量

看到這裡,答案已經基本浮現再我們面前了。

現在我們直接在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加載

C#--神奇的靜态變量
注明:圖檔來源網絡

partial類的編譯

将上面的StaticClass.A.cs修改成StaticClass.C.cs,字段A就可以和字段B愉快的在一起了。

請注意修改的字段名稱,将A改成了C。修改這個字段名稱會改變什麼内容呢。對的,就是檔案的排列順序。

這也就說明了,

C#編譯器 在編譯cs檔案的時候,是按照檔案順序一個一個加載cs檔案的。
           

CLR加載

CLR并不是開始就加載所有的可能用到的程式集,隻有用到的時候才會去加載。(這個這裡沒有展現,以後碰到具體例子在詳細說明。)

上面的例子,說明了

CLR在加載同一個類的時候,是按照順序,一行一行去加載IL代碼。
           

類的加載順序除了上面簡單的靜态變量塊,還有很多情況,下次有時間繼續講解。

繼續閱讀