静态构造函数不在静态字段之前调用

Har*_*rya 4 .net c# clr static

我有一堂课如下:

static class Configuration
    {
        private static AppSettingsSection _appSettingsLogsSection;
        static Configuration()
        {
            var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
            _appSettingsLogsSection = config.GetSectionGroup("Logs").Sections["appSettings"] as AppSettingsSection;
        }

        public static int LogSendIntervalMinutes = Convert.ToInt32(_appSettingsLogsSection.Settings["LogSendIntervalMinutes"]);

    }
Run Code Online (Sandbox Code Playgroud)

现在,根据我的理解,应该在第一次引用任何静态成员之前调用静态构造函数。但令人惊讶的是,它的行为却并非如此。当我从 Main 类引用LogSendIntervalMinutes时,调用直接转到静态字段,而不是触发静态构造函数,从而导致 NullReferenceException。

我在这里做错了什么吗?我的理解是否正确?

Dam*_*Arh 5

静态字段始终在调用静态构造函数之前初始化。LogSendIntervalMinutes您也应该在静态构造函数中初始化。我建议你甚至将其设为属性:

static class Configuration
{
    private static AppSettingsSection _appSettingsLogsSection;
    public static int LogSendIntervalMinutes { get; private set; }
    static Configuration()
    {
        var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
        _appSettingsLogsSection = config.GetSectionGroup("Logs").Sections["appSettings"] as AppSettingsSection;
        LogSendIntervalMinutes = Convert.ToInt32(_appSettingsLogsSection.Settings["LogSendIntervalMinutes"]);
    }
}
Run Code Online (Sandbox Code Playgroud)

引用C#语言规范(我加了强调):

10.4.5.1 静态字段初始化

类的静态字段变量初始值设定项对应于一系列赋值,这些赋值按它们在类声明中出现的文本顺序执行。如果类中存在静态构造函数(第 10.11 节),则在执行该静态构造函数之前立即执行静态字段初始值设定项。否则,静态字段初始值设定项将在首次使用该类的静态字段之前的依赖于实现的时间执行。