Когда у меня есть класс, содержащий статический конструктор, этот конструктор вызывается, когда сборка, содержащая класс, сначала загружается или когда удаляется первая ссылка на этот класс?Когда статический конструктор называется C#?
ответ
Когда класс открывается в первый раз.
Static Constructors (C# Programming Guide)
Статический конструктор используется для инициализации статических данных, или для выполнения конкретного действия, которое нуждается в исполнении только один раз. Он вызывается автоматически до создания первого экземпляра или ссылки на любые статические члены.
Это не так просто, как вы могли ожидать, несмотря на простую документацию. Статья Джона Скита http://csharpindepth.com/Articles/General/Beforefieldinit.aspx подробно затрагивает этот вопрос.
Резюме:
Статический конструктор гарантированно будет выполнен сразу перед первой ссылкой на члена этого класса - либо создание экземпляра или собственного статического метода/свойства класса.
Обратите внимание, что статические инициализаторы (если нет статического конструктора), которые должны быть выполнены в любое время перед первым обращением к конкретному полю.
+1. Побей меня, только только. ;) – AnthonyWJones
Это очень интересное чтение, спасибо. – Jason
Упомянутая статья теперь находится на сайте Джона Скита: http://csharpindepth.com/Articles/General/Beforefieldinit.aspx – dotnetguy
Статический конструктор вызывается до того, как вы используете что-либо в классе, но точно, когда это произойдет, зависит от реализации.
Гарантируется, что он будет вызван до того, как будет получен доступ к первому статическому члену и до создания первого экземпляра. Если класс никогда не используется, статический конструктор не может быть вызван вообще.
Когда это произойдет * не является «до реализации», если эта реализация следует за спецификацией ECMA C#: «Выполнение статического конструктора запускается первым из следующих событий, которые происходят внутри домена приложения: [1] экземпляр класса создается. [2] Ссылка на любой из статических членов класса. " (Раздел 17.11, http://www.ecma-international.org/publications/standards/Ecma-334.htm) – LukeH
@Luke: «Точное время выполнения статического конструктора зависит от реализации» http://ondotnet.com/паб/а/DotNet/2003/07/07/staticxtor.html – Guffa
@ Guffa: Это может быть интерпретация автора статьи, но вы не найдете эту формулировку в версиях Microsoft или ECMA/ISO спецификации C#. – LukeH
В случае, если статический метод вызывается из родительского класса, статический конструктор не будет вызываться, althogh явно указывается. Вот пример 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
}
}
- 1. Когда конструктор называется?
- 2. Когда статический цикл называется?
- 3. java - Когда статический {} называется?
- 4. Когда называется конструктор?
- 5. Почему мой статический конструктор не называется
- 6. Как C# знает, когда запускать статический конструктор?
- 7. который называется первый статический конструктор или частный конструктор
- 8. статический конструктор в C#
- 9. C++ поточно статический конструктор
- 10. C# Generic Статический конструктор
- 11. C# Конструктор не называется
- 12. Когда называется конструктор концентратора SignalR?
- 13. C++ неправильный конструктор, который называется
- 14. C++: Какой конструктор называется первым?
- 15. Открытый конструктор и статический конструктор
- 16. Когда именно называется конструктор статического локального объекта?
- 17. Статический конструктор называется дважды в том же appdomain?
- 18. статический конструктор не вызывается
- 19. Конструктор не называется? Зачем?
- 20. Когда конструктор называется конструктором по умолчанию?
- 21. NSData возвращает ноль, когда конструктор contentOfUrl называется
- 22. Статический конструктор в VB.NET
- 23. Почему конструктор не называется?
- 24. Статический конструктор и наследование
- 25. В каких ситуациях называется конструктор копии C++?
- 26. C# статический сборщик мусора?
- 27. Статический конструктор и синглтон
- 28. Статический и стандартный конструктор
- 29. Когда называется деструктор C++?
- 30. конструктор копирования не называется?
Спасибо, это имеет смысл, когда я думаю об этом правильно! – Jason
Интересно, что он говорит «до создания первого экземпляра или ссылки на любые статические члены». Там есть некоторая свобода в *, когда * на самом деле вызывается. –
@TimBarrass из-за некоторых других требований спецификации оказывается, что «до» на самом деле «непосредственно перед» - см. Статью Джона Скита, указанную в другом ответе - http://stackoverflow.com/a/1437372/477420 –