gpt4 book ai didi

c# - 在 Main() 之前调用的隐式静态构造函数

转载 作者:行者123 更新时间:2023-12-03 14:39:49 25 4
gpt4 key购买 nike

我有以下一段代码。

class Program
{
static void Main(string[] args)
{
Enterprise.Initialize("Awesome Company");
// Assertion failed when constructor of 'Reg' class is disabled.
Debug.Assert(Reg.Root == @"Software\Awesome Company");
}
}

public static class Enterprise
{
// Static Properties.
public static string Company
{
get;
private set;
}
// Static Methods.
public static void Initialize(string company)
{
Company = company;
}
}
public class Reg
{
public static string Root = $@"Software\{Enterprise.Company}";

// ctor.
static Reg()
{
// Assertion failed when this constructor is disabled.
}
}
执行时,断言通过。但是,当 Reg 的构造函数时断言失败了。类被禁用。仔细一看,我发现 Reg 的隐式构造函数类在 Main() 之前被调用.如果 Reg 的构造函数class 是明确定义的,它会在 Main() 之后被调用.
为什么隐式和显式构造函数之间存在这种差异?

最佳答案

这是链式静态类初始化的一个怪癖。
来自 ECMA C# Specifications

15.5.6.2 Static field initialization

The static field variable initializers of a class correspond to asequence of assignments that are executed in the textual order inwhich they appear in the class declaration (§15.5.6.1). Within apartial class, the meaning of "textual order" is specified by§15.5.6.1. If a static constructor (§15.12) exists in the class,execution of the static field initializers occurs immediately prior toexecuting that static constructor. Otherwise, the static fieldinitializers are executed at an implementation-dependent time prior tothe first use of a static field of that class.


请特别注意最后一部分,这是您的问题,如果您没有静态构造函数,您将无法控制字段何时初始化。在您的测试用例中,它们在您调用 Enterprise.Initialize 之前已被初始化。
总之,你不应该依赖这些规则,很容易出错,很可能会导致奇怪的问题。

关于c# - 在 Main() 之前调用的隐式静态构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63718950/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com