我有一个关于Value type 中的类型构造函数的问题。这个问题的灵感来自 Jeffrey Richter 通过 C# 第 3 版在 CLR 中编写的内容,他说(在第 195 页 - 第 8 章)您永远不应该在值类型中实际定义类型构造函数,因为有时 CLR 不会调用它。
因此,例如(嗯......实际上是 Jeffrey Richters 的例子),即使通过查看 IL,我也无法弄清楚为什么在以下代码中没有调用类型构造函数:
internal struct SomeValType
{
static SomeValType()
{
Console.WriteLine("This never gets displayed");
}
public Int32 _x;
}
public sealed class Program
{
static void Main(string[] args)
{
SomeValType[] a = new SomeValType[10];
a[0]._x = 123;
Console.WriteLine(a[0]._x); //Displays 123
}
}
因此,将以下规则应用于类型构造函数,我只是看不出为什么根本不调用上面的值类型构造函数。
- 我可以定义一个静态值类型构造函数来设置类型的初始状态。
- 一种类型只能有一个构造函数——没有默认构造函数。
- 类型构造函数是隐式私有的
- JIT 编译器检查该类型的类型构造函数是否已在此 AppDomain 中执行。如果不是,它将调用发送到本机代码,否则它不会因为它知道类型已经“初始化”。
所以......我只是无法弄清楚为什么我看不到正在构造的这种类型数组。
我最好的猜测是它可能是:
- CLR 构造类型数组的方式。我原以为创建第一个项目时会调用静态构造函数
- 构造函数中的代码未初始化任何静态字段,因此被忽略。我已经尝试在构造函数中初始化私有静态字段,但该字段仍然是默认的 0 值 - 因此不调用构造函数。
- 或者......由于设置了公共 Int32,编译器以某种方式优化了构造函数调用 - 但这充其量只是一个模糊的猜测!
除了最佳实践等,我只是对它非常感兴趣,因为我希望自己能够看到为什么它没有被调用。
编辑:我在下面添加了对我自己的问题的答案,只是引用了 Jeffrey Richter 所说的话。
如果有人有任何想法,那就太好了。非常感谢,詹姆斯