class 或 struct 如果没有明确定义,是否有默认的静态构造函数?

Does a class or struct have a default static constructor if not explicitly defined with one?

C# 规范指出,如果没有在 class 或结构类型中显式定义无参数构造函数,则 C#(我假设它指的是编译器,如果我错了请纠正我) 为它们提供一个,以便在创建该类型的实例时,如果实例字段未在声明时或由任何参数化构造函数初始化,则提供的默认无参数构造函数将用于将实例字段初始化为其默认值。 =14=]

If you don't provide a constructor for your class, C# creates one by default that instantiates the object and sets member variables to the default values as listed in the Default values of C# types article. If you don't provide a constructor for your struct, C# relies on an implicit parameterless constructor to automatically initialize each field to its default value.

    public class Program
    {
        static void Main(string[] args)
        {
            //invoke default parameter-less constructor belonging to types MyClass and MyStruct
            MyClass inst1 = new MyClass();

            MyStruct inst2 = new MyStruct();
        }
    }

    public class MyClass
    {
        //body
    }

    public struct MyStruct
    {
        //body
    }

然而,class 类型或结构类型中的静态构造函数也是如此吗? 从某种意义上说,如果您不明确定义无参数静态构造函数,C#(我假设是编译器,如果我错了请纠正我)会默认为您提供一个吗?为了初始化未在声明时或程序执行期间的任何时候初始化的静态字段?

C# 规范只是说明

Static constructors are parameterless. If you don't provide a static constructor to initialize static fields, the C# compiler initializes static fields to their default value as listed in the Default values of C# types article.

以上文字并没有回答问题。另外,我不知道如何在代码中对此进行测试(就像我使用默认的非静态无参数构造函数所做的那样),因为无法在代码中显式调用静态构造函数。

静态构造函数的存在实际上很重要(一点点),如前所述here:

The presence of a static constructor prevents the addition of the BeforeFieldInit type attribute. This limits runtime optimization.

这意味着如果您不声明静态构造函数,则不会自动生成静态构造函数。因为如果总是为class生成一个静态构造函数,那这句话就没有多大意义了。

我们可以通过查看 SharpLab 上的 IL 来检查。

额外的静态构造函数在 IL 中声明为:

.method private hidebysig specialname rtspecialname static 
    void .cctor () cil managed 
{
    // Method begins at RVA 0x2050
    // Code size 1 (0x1)
    .maxstack 8

    IL_0000: ret
} // end of method C::.cctor