转载:static的初始化顺序
轉自:http://www.cnblogs.com/yfsun1/archive/2006/07/14/450847.html
先看個例子:
using System;
Class A
{
?static int X;
?static A()
?{
??X = B.Y + 1;
?}
}
Class B
{
?public static int Y = A.X + 1;
?static B() {}
?
?static void Main()
?{
??Console.WriteLine("X={0},Y={1}",A.X,B.Y);?
? }
}
執行結果是X=1,Y=2
這個例子主要考查2個方面,一是static的用法,二是static的初始化順序。了解了static的初始化順序和規則,這個問題答答案就很容易理解了。這里涉及到以下三類static對象:static成員,static方法,static構造函數。規則如下:
一個類的static構造函數在給定的應用程序域中僅執行一次。static構造函數由在應用程序域的下列事件的首次發生時觸發:
1)該類的實例被創建。
2)任何一個static成員被引用
3)如果類包含執行入口Main方法,此類的static構造函數在Main方法被調用之前執行。
4)如果類包含任何staic成員,則這些static成員在static構造函數之前進行初始化。
5)如果類包含任何static方法,則這些static方法在static構造函數之后進行初始化。
6)對于存在多個static成員,他們的初始化將按照文本順序進行,不會因為調用順序而改變。
現在看看上面的應用程序,Class B中有個Main執行入口,所以B首先得到初始化,順序是static成員Y->static構造函數。在初始化Y時,引用了A.X,編譯器又開始初始化Class A(注意這時Class B的初始化并沒有完成),順序也是static成員X->static構造函數。Class A中X在定義的時候沒有被賦予初始值(在定義static變量時,盡量賦予初始值),編譯器會默認賦予值0(int型)。然后再執行static的構造函數,由于Class B的初始化這時還沒有完成,所以B.Y的值在這時被編譯器賦予默認值0,所以在A的static的構造函數執行完后,X的值變為1,然后返回B繼續完成初始化,得到Y的值為2。最后執行Main,輸出A.X和B.Y的值。相反地,如果將B中的Main方法移出放在一個類C中,那執行結果又是什么呢?依據以上的規則,可以很方便的得出答案。
以下這題可以用來說明規則六,有興趣的朋友可以思考一下答案
?class Class1
??? {
??????? private static Class1 obj = new Class1();
??????? public static int counter1;
??????? public static int counter2 = 0;
??????? private Class1()
??????? {
??????????? counter1++;
??????????? counter2++;
??????? }
??????? public static Class1 getInstance()
??????? {
??????????? return obj;
??????? }
???????
??????? [STAThread]
??????? static void Main(string[] args)
??????? {
??????????? Class1 obj = Class1.getInstance();
??????????? Console.WriteLine("Class1.counter1=="+Class1.counter1);
??????????? Console.WriteLine("Class1.counter2=="+Class1.counter2);
???????????
??????? }
??? }
轉載于:https://www.cnblogs.com/yangfan/archive/2010/02/02/1662113.html
總結
以上是生活随笔為你收集整理的转载:static的初始化顺序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++Builder中开发Activex
- 下一篇: 12种性格导致贫穷