环境:C#6,Visual Studio 2015 CTP 6
给出以下示例:
namespace StaticCTOR
{
struct SavingsAccount
{
// static members
public static double currInterestRate = 0.04;
static SavingsAccount()
{
currInterestRate = 0.06;
Console.WriteLine("static ctor of SavingsAccount");
}
//
public double Balance;
}
class Program
{
static void Main(string[] args)
{
SavingsAccount s1 = new SavingsAccount();
s1.Balance = 10000;
Console.WriteLine("The balance of my account is \{s1.Balance}");
Console.ReadKey();
}
}
}
由于某种原因,静态ctor没有被执行。如果我将SavingsAccount声明为一个类而不是一个结构,它就可以正常工作。
答案 0 :(得分:13)
静态构造函数没有被执行,因为你没有使用结构的任何静态成员。
如果使用静态成员currInterestRate
,则首先调用静态构造函数:
Console.WriteLine(SavingsAccount.currInterestRate);
输出:
static ctor of SavingsAccount
0,06
当您使用类时,将在创建实例之前调用静态构造函数。为结构调用构造函数不会创建实例,因此它不会触发静态构造函数。
答案 1 :(得分:0)
根据CLI规范:
如果未标记BeforeFieldInit,则该类型的初始化方法为 在以下位置执行(即由触发):
- 首先访问该类型的任何静态字段,或
- 首次调用该类型的任何静态方法,或
- 首次调用该类型的任何实例或虚拟方法(如果它是值类型或
)- 该类型的任何构造函数的首次调用
对于具有隐式默认构造函数的结构,实际上不会调用它,因此您可以创建实例并访问其字段。其他所有内容(调用自定义构造函数,实例属性访问,方法调用,静态字段访问)都将触发静态构造函数调用。
另外请注意,调用在结构中未覆盖的继承的Object
方法(例如ToString()
)不会触发静态构造函数调用。