【问题标题】:Does every type have static constructor?每种类型都有静态构造函数吗?
【发布时间】:2021-04-07 13:25:32
【问题描述】:

根据documentation: 自动调用静态构造函数。它在创建第一个实例或引用任何静态成员之前初始化类。

这是否意味着每种类型(有或没有静态成员)都有静态构造函数? 还是静态构造函数存在于具有静态成员或显式定义的类型中?

这种类型是否有在后台自动调用的静态构造函数?

class Test
 {
    public Test()
    {
        System.Console.WriteLine("Type initialized!");
    }     
 }

【问题讨论】:

  • 纯粹出于好奇,您可以查看 IL 代码。对此是否有实际兴趣,您是否有需要此答案才能做出决定的案例?
  • 我认为您可以从文档中推断出并非所有类型都具有默认的静态构造函数。请参阅此评论:“静态构造函数的存在阻止了添加 BeforeFieldInit 类型属性。这限制了运行时优化。”如果每个类型都被赋予了一个自动静态构造函数,那么文档中就不会存在这一行,并且BeforeFieldInit 属性也不会被使用。
  • Here's the IL of this class in Sharplab.io。没有.cctor(静态构造函数)。与the same class with a static member比较。

标签: c# .net static-constructor


【解决方案1】:

从文档中引用,答案似乎是NO,只有明确编写静态构造函数的类型才有一个。有两点暗示了这一点:

如果您不提供静态构造函数来初始化静态字段,则所有静态字段都将初始化为其默认值,如 C# 类型的默认值中所列。

这表明并不总是需要静态构造函数,并且 CLR 提供了默认行为。

静态构造函数的存在阻止了添加 BeforeFieldInit 类型属性。这限制了运行时优化。

这表明 CLR 可以根据静态构造函数的存在(或不存在)来改变其行为。

也就是说,任何类或结构都可以有一个静态构造函数,无论它是否有任何静态成员。但是好像你不写编译器不会自动生成的。

【讨论】:

  • only types where you explicitly write a static constructor has one 我认为这有点误导。初始化静态成员会为你生成一个静态构造函数cctorsharplab.io/…
猜你喜欢
  • 1970-01-01
  • 2021-11-08
  • 1970-01-01
  • 2011-10-07
  • 2018-01-12
  • 2013-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多