静态场初始化器

时间:2014-07-21 19:05:08

标签: c# static

我的代码与静态代码初始化程序的实现之间陷入了困境。现在,我在这里呼叫静态字段" x"主要分别为A类和B类。理想情况下,它应该生成输出:

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();
        }
    }
}

2 个答案:

答案 0 :(得分:1)

字段的静态初始化以非确定性顺序发生,尝试使AB的构造函数为static,并初始化其中的变量。确保在第一次使用您的课程时以及您指定的顺序初始化它。

答案 1 :(得分:0)

CLR首先分析主要代码:

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

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

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