类的初始化顺序

原理:静态成员是和实例成员的存储和管理方式不一样。

静态成员:被static修饰的成员,叫做静态成员。静态成员是属于类的。通过类名直接访问。

  • 当类第一次被访问的时候,就会将这个类下面的所有的静态成员创建在内存当中。
  • 静态成员既不在栈也不在堆中。创建在静态存储区。
  • 静态成员只创建一次,在类第一次被访问的时候创建。
  • 静态成员一旦被创建在静态存储区,那么就不会被回收,直到程序结束。

 实例成员没有被static修饰的成员叫做实例成员。实例成员是属于对象的。通过对象名去访问实例成员。

  • 在创建对象的时候,实例成员跟随着对象一起创建在堆中。
  • 跟着对象一起创建在堆空间中。
  • 有多少个对象,实例成员就有多少份。
  • 对象被回收,这个对象中的实例成员就跟随着一起回收。

创建类的一个实例时,在执行构造函数之前,如果你没有给成员变量赋初始值,C#编译器缺省将每一个成员变量初始化为他的默认值。

类的初始化顺序 如下:

第一次实例化Son============================

C#编译器缺省将每一个成员变量初始化为他的默认值
Son静态字段   :
Son静态构造函数
Son非静态变量
Father静态字段
Father静态构造函数
Father非静态变量
Father 构造函数
Son构造函数
Son对象初始值设定项

类初始化和对象(实例化)完成


第N次(N>1)的实例化Son============================
Son非静态变量
Father非静态变量
Father 构造函数
Son构造函数
Son对象初始值设定项

对象初始化(实例化)完成

 具体代码如下:

    public struct MBase
    {

        public MBase(string name)
        {
            Console.WriteLine($"{name}");
        }
    }
    public class Father
    {
        public MBase name2 = new MBase("Father字段 ");
        public static MBase name1 = new MBase("Father静态字段 ");
        public static string Name;

        public static MBase Name1 { get => name1; set => name1 = value; }

        static Father()
        {
            Name = "Father静态构造函数";
            Console.WriteLine(Name);
        }
        public Father()
        {
            Name = "Father 构造函数";
            Console.WriteLine(Name);
        }


    }

    public class Son : Father
    {
        public static MBase Age1 = new MBase("Son静态字段 ");
        public MBase Age2 = new MBase("Son字段 ");
        public static MBase Age3;
        public static string Age = "12 const";
        public readonly string A1 = "10";
        public Son(string a)
        {
            A1 = a;
            Age = "Son构造函数"+a;
            Console.WriteLine(Age);
        }
        static Son()
        {
            Age = "Son静态构造函数";
            Console.WriteLine(Age);
        }
        public string B
        {
            get => A1;
            init
            {
                A1 = value;
                Console.WriteLine("Son对象 ");
            }
        }




    }
    public class Test
    {

        static void Main(string[] args)

        {
            Console.WriteLine("第一次实例化Son============================");
            Console.WriteLine("C#编译器缺省将每一个成员变量初始化为他的默认值");
            Son a = new Son("a") { B = "A" };

            Console.WriteLine();
            Console.WriteLine("第N次(N>1)的实例化Son============================");
            Son b = new Son("a") { B = "A" };
            Console.ReadKey();

        }

    }

 

posted @ 2021-09-18 14:06  小林野夫  阅读(291)  评论(0编辑  收藏  举报
原文链接:https://www.cnblogs.com/cdaniu/