【发布时间】:2014-07-21 19:05:07
【问题描述】:
我被困在我的代码与静态代码初始化器的实现之间。现在,我在这里分别调用 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();
}
}
}
【问题讨论】:
-
由于
A和B没有声明静态构造函数,它们的字段初始化器在第一次使用每个类的静态字段之前在依赖于实现的时间执行。在这种情况下,CLR 选择在 Main 的开头执行两个字段初始值设定项。 -
要获得您期望的行为,请将空的静态构造函数添加到
A和B(static A() { }和static B() { })。 -
@Micahel Liu 我在 Main Method 中注释掉了两个 Writeline 函数,但是没有生成输出。理想情况下,我期望输出为 A:0 和 B:0(根据你的回答) .
-
如果您注释掉对 WriteLine 的调用,那么“第一次使用”永远不会发生,因此 CLR 可能会选择根本不执行字段初始化程序。尝试添加空的静态构造函数。
-
@MichaelLiu 添加空的静态构造函数工作......谢谢男人