Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Static constructor not called before static fields

Tags:

c#

.net

static

clr

I have a class as follows :

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"]);

    }

Now, as per my understanding, the static constructor should be called before the first reference to any static member is made. But surprisingly, it is not behaving like that. When I reference LogSendIntervalMinutes from Main class, instead of triggering the static constructor, call goes straight to the static field resulting in a NullReferenceException.

Am I doing something wrong here and is my understanding correct?

like image 442
Harsh Maurya Avatar asked Dec 19 '22 18:12

Harsh Maurya


1 Answers

Static fields are always initialized before static constructor is called. You should initialize LogSendIntervalMinutes in static constructor as well. I'd suggest you even make it a property:

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"]);
    }
}

Quote from C# language specification (I added the emphasis):

10.4.5.1 Static field initialization

The static field variable initializers of a class correspond to a sequence of assignments that are executed in the textual order in which they appear in the class declaration. If a static constructor (Section 10.11) exists in the class, execution of the static field initializers occurs immediately prior to executing that static constructor. Otherwise, the static field initializers are executed at an implementation-dependent time prior to the first use of a static field of that class.

like image 105
Damir Arh Avatar answered Dec 30 '22 09:12

Damir Arh