C# 之静态构造器与静态字段初始化器

public class Test
    {
        /// <summary>
        /// 静态字段初始化器会在调用静态构造器前运行。
        /// 如果类型没有静态构造器,字段会在类型被使用前或运行时中更早的时间进行初始化.
        /// 静态字段初始化器按照字段声明的先后顺序运行。
        /// </summary>
        public static int X = Y;//静态字段初始化器
        public static int Y = 3;//静态字段初始化器
        public static int Z = 6;//静态字段初始化器
        public static int ZX = Z;//静态字段初始化器
        /// <summary>
        /// 静态构造器,一个类型只能定义一个静态构造器,名称必须和类名相同,且没有参数。
        /// 运行时将在类型使用之前调用静态构造器,以下两种行为可以触发静态构造器执行:
        /// ·实例化类型
        /// ·访问类型的静态成员
        /// </summary>
        static Test()
        {
            Console.WriteLine("Test Type Initialized");
        }
        public Test()
        {
            Console.WriteLine("This is Initalize function");
        }
    }

    class ProgramA
    {
        static void Main()
        {
            Test t = new Test();
            Console.WriteLine("X is "+Test.X);
            Console.ReadLine();
        }
    }

OUTPUT:

Test Type Initialized
This is Initalize function
X is 0

输出结果正证实了:静态构造器只会执行一次。

class ProgramA
    {
        static void Main()
        {
            Console.WriteLine("Z is " + Test.Z);
            Console.WriteLine("ZX is "+Test.ZX);
            Console.ReadLine();
        }
    }

output:

Test Type Initialized
Z is 6
ZX is 6

输出结果正证实了:静态字段初始化器是按照顺序进行的。

class Foo
    {
        /// <summary>
        /// 静态字段初始化器按照声明顺序运行
        /// </summary>
        public static Foo Instance = new Foo();
        public static int X = 3;
        Foo()
        {
            Console.WriteLine(X);
   }
    }


    class ProgramA
    {
        static void Main()
        {
            //静态字段初始化器在类型使用前就运行,所以首先是运行Instance,
            //而Instance正好调用了实例构造函数,而实例构造函数打印X,而此时,
            //X还没有赋值,所以打印出0,而后,才初始化X为3,再在Main()函数中打印出X,即3
            Console.WriteLine(Foo.X);
            Console.ReadLine();
        }
    }

output:

0
3
posted @ 2022-11-12 17:22  JohnYang819  阅读(301)  评论(0编辑  收藏  举报