静态字段初始化器

本文关键字:初始化 字段 静态 | 更新日期: 2023-09-27 18:14:14

我被困在我的代码和静态代码初始化器的实现之间。现在,我在Main中分别调用类A和类B的静态字段"x"。理想情况下,它应该生成如下输出:

A : 0
A.x : 5
B : 0
B.x : 5  

但是,它生成的输出如下:

A : 0
B : 0
A.x : 5
B.x : 5  

请解释。

Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication2
{
    public class A
    {
        public static A _A = new A();
        public static int x = 5;
        public A()
        {
            Console.WriteLine("A : " + x);
        }
    }
    public class B
    {
        public static B _B = new B();
        public static int x = 5;
        public B()
        {
            Console.WriteLine("B : " + x);
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("A.x : " + A.x);
            Console.WriteLine("B.x : " + B.x);
            Console.ReadKey();
        }
    }
}

静态字段初始化器

字段的静态初始化以不确定的顺序发生,尝试将AB的构造函数设置为静态,并初始化其中的变量。确保它在你的类第一次被使用时按照你指定的顺序被初始化。

CLR首先分析main中的代码:

这里使用了2个静态类,因此将按照它们使用的顺序解析它们的构造函数。

因此首先执行构造函数内部的Writeline,然后执行主代码的Writeline。

如果您使用了Console。WriteLine for B首先在main中,然后是A,然后B的构造函数将首先执行