Статические конструкторы также очень полезны, когда у вас есть статические поля, которые зависят друг от друга, так что важен порядок инициализации.Если вы запустите свой код через форматтер / beautifier, который изменяет порядок полей, вы можете оказаться с нулевыми значениями там, где вы их не ожидали.
Пример: предположим, у нас был этот класс:
class ScopeMonitor
{
static string urlFragment = "foo/bar";
static string firstPart= "http://www.example.com/";
static string fullUrl= firstPart + urlFragment;
}
Когда вы получите доступ к fullUr
, это будет "http://www.example.com/foo/bar".
Спустя месяцы вы очищаете свой код и расставляете по буквам поля (скажем, они являются частью гораздо большегосписок, поэтому вы не замечаете проблему). У вас есть:
class ScopeMonitor
{
static string firstPart= "http://www.example.com/";
static string fullUrl= firstPart + urlFragment;
static string urlFragment = "foo/bar";
}
Ваше значение fullUrl
теперь просто "http://www.example.com/", поскольку urlFragment
не было инициализировано ввремя fullUrl
было установлено.Нехорошо.Итак, вы добавляете статический конструктор, чтобы позаботиться об инициализации:
class ScopeMonitor
{
static string firstPart= "http://www.example.com/";
static string fullUrl;
static string urlFragment = "foo/bar";
static ScopeMonitor()
{
fullUrl= firstPart + urlFragment;
}
}
Теперь, независимо от того, в каком порядке вы располагаете поля, инициализация всегда будет правильной.