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);

        }



    }

 

你可能感兴趣的:(初始化)