Ви задали тут лише одне запитання, але є десяток запитань, які ви мали б задати , тож я відповім на всі.
Ось послідовність, яку я припустив
- Початок конструктора класу (також відомого як
cctor
)
- Кінець cctor
- початок Main
- початок MyMethod
Це правильно?
Ні. Правильна послідовність:
- Початок cctor для програми, якщо він є. Немає.
- Кінець cctor для програми, якщо він є. Немає.
- Початок головного
- Початок cctor для MyClass
- Кінець cctor для MyClass
- Початок MyClass.MyMethod
Що робити, якщо є ініціалізатор статичного поля?
CLR дозволяється змінювати порядок, в якому в деяких випадках запускаються ініціалізатори статичних полів. Детальніше див. Сторінку Джона на цю тему:
Відмінності між статичними конструкторами та ініціалізаторами типу
Чи можливо коли-небудь статичний метод, як MyMethod
виклик, до завершення cctor цього класу?
Так. Якщо сам cctor викликає MyMethod, тоді очевидно MyMethod буде викликаний до завершення cctor.
Коктор не викликає MyMethod. Чи можливо коли-небудь статичний метод, як MyMethod
виклик до завершення cctor MyClass?
Так. Якщо cctor використовує інший тип, cctor якого викликає MyMethod, тоді MyMethod буде викликаний до завершення MyClass cctor.
Жоден доктор не викликає MyMethod, прямо чи побічно! Тепер чи можливо коли-небудь статичний метод, як MyMethod
виклик, до завершення cctor MyClass?
Ні.
Це все ще правда, навіть якщо задіяно кілька потоків?
Так. Коектор закінчується в одному потоці, перш ніж статичний метод можна буде викликати в будь-якому потоці.
Чи можна cctor викликати більше одного разу? Припустимо, два потоки призводять до запуску cctor.
Гарантовано, що cctor буде викликаний не більше одного разу, незалежно від кількості потоків. Якщо два потоки викликають MyMethod "одночасно", тоді вони перегони. Один з них програє гонку та блокує, поки cctor MyClass не завершить переможну нитку.
Втрачаючий потік блокується, доки cctor не закінчиться? Справді ?
Дійсно.
Так що, якщо cctor у виграшному потоці викликає код, який блокує замок, раніше взятий програним потоком?
Тоді у вас є класичний стан інверсії замовлення. Тупики вашої програми. Назавжди.
Це здається небезпечним. Як я можу уникнути глухого кута?
Якщо вам боляче, коли ви це робите, тоді припиніть це робити . Ніколи не робіть щось, що може заблокувати в cctor.
Чи є гарною ідеєю покладатися на семантику ініціалізації cctor для забезпечення складних вимог безпеки? І чи є гарною ідеєю мати cctor, який здійснює взаємодію користувачів?
Також не є хорошими ідеями. Моя порада полягає в тому, що вам слід знайти інший спосіб забезпечити виконання передумов ваших методів, що впливають на безпеку.