c#类的成员初始化顺序【转】

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            // DriveB d = new DriveB();  
            DriveC f = new DriveC();
        }
    }

    class BaseA
    {
        static DisplayClass a = new DisplayClass("基类静态成员初始化");

        DisplayClass BaseA_c = new DisplayClass("基类实例变量BaseA_c初始化");

        public BaseA() { Console.WriteLine("基类构造方法被调用A"); }
    }

    class DriveB : BaseA
    {
        static DisplayClass DriveB_b = new DisplayClass("继承类静态成员DriveB_b初始化");
        //static BaseA DriveB_a = new BaseA();        
        DisplayClass DriveB_c = new DisplayClass("继承类实例变量DriveB_c初始化");

        public DriveB() { Console.WriteLine("继承类构造方法被调用B"); }
    }
    class DriveC : DriveB
    {
        static DisplayClass DriveC_d = new DisplayClass("继承类静态成员DriveC_d初始化");
        DisplayClass DriveC_e = new DisplayClass("继承类静态成员DriveC_e初始化");
        public DriveC()
        {
            Console.WriteLine("继承类构造方法被调用C");
        }
    }
    class DisplayClass
    {
        public DisplayClass(string diplayString)
        {
            Console.WriteLine(diplayString);
            Console.WriteLine();
        }
    }

}

 

 

 

输出结果为:

继承类静态成员DriveC_d初始化

继承类静态成员DriveC_e初始化

继承类静态成员DriveB_b初始化

继承类实例变量DriveB_c初始化

基类静态成员初始化

基类实例变量BaseA_c初始化

基类构造方法被调用A 继承类构造方法被调用B 继承类构造方法被调用C 请按任意键继续. . .

由此可见c#中类成员的初始化与java不同,总结下有四条规律

1。类成员变量初始化先于类的构造函数

2。静态成员变量先于实例变量

3。子类成员变量先于父类成员变量

4。父类构造函数先于子类构造函数

class A
    {
        public static int X;
        static A()
        {
            X = B.Y + 1;
        }
    }
    class B
    {
        public static int Y = A.X + 1;
        static B() { 
            Y = A.X + 1; 
        }
        static void Main()
        {
            Console.WriteLine("X={0},Y={1}", A.X, B.Y);
        }

    }

 

posted @ 2012-05-29 09:04  呼啦啦bear  阅读(407)  评论(0编辑  收藏  举报