zoukankan      html  css  js  c++  java
  • 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);
            }
    
        }
  • 相关阅读:
    字符串的格式化操作
    了解格式化输出,字符串和编码
    面试题2
    面试题1
    设计算法1
    C++ STL容器的理解
    网络是怎样连接的-路由器的附加功能
    网络是怎样连接的-路由器的包转发操作(下)
    网络是怎样连接的-路由器的包转发操作(上)
    网络是怎样连接的-交换机的包转发操作
  • 原文地址:https://www.cnblogs.com/lovebear/p/2523405.html
Copyright © 2011-2022 走看看