Коли у мене є клас, що містить статичний конструктор, чи викликається цей конструктор, коли збірка, що містить клас, завантажується вперше або коли потрапляє перше посилання на цей клас?
Відповіді:
Коли клас відвідується вперше.
Статичні конструктори (Посібник з програмування на C #)
Статичний конструктор використовується для ініціалізації будь-яких статичних даних або для виконання певної дії, яку потрібно виконати лише один раз. Він викликається автоматично перед створенням першого екземпляра або посиланням на будь-які статичні члени.
A static constructor is used to initialize any static data
НЕМАЄ. Краще використовувати static initializer
для ініціалізації статичних речей.
Це не так просто, як можна було б очікувати, незважаючи на пряму документацію. Стаття Джона Скіта http://csharpindepth.com/Articles/General/Beforefieldinit.aspx детально розглядає це питання.
Короткий зміст:
Статичний конструктор гарантовано виконується безпосередньо перед першим посиланням на члена цього класу - або створення екземпляра, або власний статичний метод / властивість класу.
Зверніть увагу, що статичні ініціалізатори (якщо немає статичного конструктора) гарантовано виконуються в будь-який час до першого посилання на певне поле.
Статичний конструктор викликається до того, як ви використовуєте що-небудь у класі, але саме тоді це залежить від реалізації.
Гарантований виклик до доступу до першого статичного члена та до створення першого екземпляра. Якщо клас ніколи не використовується, статичний конструктор взагалі не гарантується.
У разі виклику статичного методу з батьківського класу, статичний конструктор не буде викликаний, хоча це явно вказано. Ось приклад конструктора b не викликається, якщо b.methoda () викликається.
static void Main(string[] args)
{
b.methoda();
}
class a
{
public static void methoda()
{
//using initialized method data
}
}
class b : a
{
static b()
{
//some initialization
}
}
Здається, існує помилка зі статичними конструкторами, на яку дають відповіді в іншому місці, але потрібно деякий час, щоб перетворити її на просте пояснення. Усі документи та пояснення стверджують, що статичний конструктор / ініціалізатори "гарантовано" запускатиметься перед створенням першого класу або посиланням на перше статичне поле. Зачіпка з’являється, коли ви намагаєтесь додати статичний синглтон до класу, який створює екземпляр самого себе (курка / яйце). У цьому випадку статичний конструктор закінчується викликом після конструктора екземпляра - і в моєму випадку конструктор екземпляра містив код, який покладався на деякі статичні дані.
Статичний конструктор, що викликається після конструктора екземпляра?
Статичний конструктор може працювати за нестатичним конструктором. Це помилка компілятора?
(для мене відповіддю було помістити синглтон в окремий клас або ініціалізувати вручну статичні дані в конструкторі екземпляра до того, як це буде потрібно)