• 静态构造函数, 静态成员初始化/调用顺序


    1)第一次调用类的任何成员之前,执行静态成员的初始化动作,执行顺序是:静态成员初始化--->静态构造函数--->调用类的某成员(构造器,静态字段/属性/函数,)

    2)在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数。调用静态构造函数之前会先做静态成员的初始化。同1)。

    如果类包含静态字段,请提供在加载类时初始化这些字段的静态构造函数。在应用程序域的生存期内,静态类一直保留在内存中。

    总结:创建实例,引用/调用静态字段/函数会导致CLR 初始化静态成员和调用静态构造函数。只是获取type类型或者没有关于类的任何引用代码,静态成员的初始化和静态构造函数不会执行。

    示例程序,main函数中分别打开TestCast1,2,3,4. 观察运行结果:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace static_const_readonly
    {
        class MyClass
        {
            public static readonly int Count = 0;
            public static MyTest TEST = new MyTest();
    
            static MyClass()
            {
                Console.WriteLine("static MyClass() ctor.");
                TEST = new MyTest();
            }
    
            public static void FuncStatic()
            {
                Console.WriteLine("static void FuncStatic().");
            }
    
            public MyClass()
            {
                Console.WriteLine("MyClass() ctor");
            }
        }
    
        class MyTest
        {
            public MyTest()
            {
                Console.WriteLine("My Test ctor.");
            }
        }
    
        class Program
        {
             static void TestCast1()
            {
                Console.WriteLine("test starts.");
                MyClass myobject = new MyClass(); // call ctor
            }
    
             static void TestCast2()
             {
                 Console.WriteLine("test starts.");
                 Console.WriteLine("static MyClass.Count = {0}.", MyClass.Count); // get MyClass.Count
             }
    
            static void TestCast3()
            {
                Console.WriteLine("test starts."); // not refer to MyClass
                Console.WriteLine(typeof(MyClass));
            }
    
            static void TestCast4()
            {
                Console.WriteLine("test starts."); // not refer to MyClass
                MyClass.FuncStatic();
            }
    
            static void TestCast5()
            {
                Console.WriteLine("test starts."); // not refer to MyClass
            }
    
            static void Main(string[] args)
            {
                //TestCast1();
                //TestCast2();
                //TestCast3();
                TestCast4();
                // TestCast5();
            }
        }
    }
    
    

    TestCase1结果:

    test starts.
    My Test ctor.
    static MyClass() ctor.
    My Test ctor.
    MyClass() ctor

    TestCase2结果:

    test starts.
    My Test ctor.
    static MyClass() ctor.
    My Test ctor.
    static MyClass.Count = 0.

    TestCase3结果:

    test starts.
    static_const_readonly.MyClass

    TestCase4结果:

    test starts.
    My Test ctor.
    static MyClass() ctor.
    My Test ctor.
    static void FuncStatic().

    TestCase5结果:

    test starts.

  • 相关阅读:
    数据结构之 线性表 逆序简历链表
    数据结构之 线性表--顺序创建链表
    参观——校园招聘大会
    SDUT OJ 之 1571 《人品,有没有?》 字符串的处理问题
    青岛理工交流赛 H题 素数间隙
    青岛理工ACM交流赛 J题 数格子算面积
    STL版 括号匹配(感觉不如之前自己用数组模拟的跑的快)
    1076: [SCOI2008]奖励关( dp )
    BZOJ 1079: [SCOI2008]着色方案( dp )
    BZOJ 1984: 月下“毛景树”( 树链剖分 )
  • 原文地址:https://www.cnblogs.com/dirichlet/p/3266019.html
Copyright © 2020-2023  润新知