静态构造函数不适用于结构
Static constructor not working for structs
环境: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();
}
}
}
静态构造函数由于某种原因没有被执行。如果我将 SavingsAccount 声明为 class 而不是结构,它就可以正常工作。
静态构造函数未执行,因为您没有使用该结构的任何静态成员。
如果使用静态成员currInterestRate
,则首先调用静态构造函数:
Console.WriteLine(SavingsAccount.currInterestRate);
输出:
static ctor of SavingsAccount
0,06
当您使用 class 时,将在创建实例之前调用静态构造函数。为结构调用构造函数不会创建实例,因此不会触发静态构造函数。
根据 CLI 规范:
If not marked BeforeFieldInit then that type’s initializer method is
executed at (i.e., is triggered by):
- first access to any static field of that type, or
- first invocation of any static method of that type, or
- first invocation of any instance or virtual method of that type if it is a value type or
- first invocation of any constructor for that type
对于具有隐式默认构造函数的结构,实际上不会调用它,因此您可以创建一个实例并访问其字段。其他一切(调用自定义构造函数、实例 属性 访问、方法调用、静态字段访问)都将触发静态构造函数调用。
另请注意,调用继承的 Object
未在结构中重写的方法(例如 ToString()
)不会触发静态构造函数调用。
环境: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();
}
}
}
静态构造函数由于某种原因没有被执行。如果我将 SavingsAccount 声明为 class 而不是结构,它就可以正常工作。
静态构造函数未执行,因为您没有使用该结构的任何静态成员。
如果使用静态成员currInterestRate
,则首先调用静态构造函数:
Console.WriteLine(SavingsAccount.currInterestRate);
输出:
static ctor of SavingsAccount
0,06
当您使用 class 时,将在创建实例之前调用静态构造函数。为结构调用构造函数不会创建实例,因此不会触发静态构造函数。
根据 CLI 规范:
If not marked BeforeFieldInit then that type’s initializer method is executed at (i.e., is triggered by):
- first access to any static field of that type, or
- first invocation of any static method of that type, or
- first invocation of any instance or virtual method of that type if it is a value type or
- first invocation of any constructor for that type
对于具有隐式默认构造函数的结构,实际上不会调用它,因此您可以创建一个实例并访问其字段。其他一切(调用自定义构造函数、实例 属性 访问、方法调用、静态字段访问)都将触发静态构造函数调用。
另请注意,调用继承的 Object
未在结构中重写的方法(例如 ToString()
)不会触发静态构造函数调用。