Что происходит "внутри" при обращении к статическому методу не статического класса?
Имеем не статический класс. Что происходит под капотом при первом и последующих вызовах статического метода этого класса? Язык - c#
Создаётся ли "единый" статический экземпляр класса?
Или код выполняется иным способом
Ответы (1 шт):
Что происходит под капотом при первом и последующих вызовах статического метода этого класса? Язык - c#
Ничего особенного, в сущности. Тут скорее надо ставить вопрос по другому, что не происходит, по сравнению с вызовом метода экземпляра. Если взять код Test.TestStatic("Hello, world");, то на уровне IL он будет представлен так:
ldstr "Hello, world"
call void Test::TestStatic(string)
То есть аргументы загружаются в стек, и управление передается вызываемому методу. Экземпляр класса нигде не фигурирует. Первый вызов будет отличаться только в случае, если это вообще первое обращение к классу за все время выполнения программы - тогда перед ним будет вызван статический конструктор и проинициализированы статические поля. Остальные вызовы идентичны.
Для сравнения, вызов метода экземпляра:
ldloc.0
ldstr "Hello, world"
callvirt instance void Test::TestInstance(string)
Первая инструкция здесь загружает в стек ссылку на экземпляр класса (который хранится в локальной переменной 0) - она играет роль неявного первого параметра. Инструкция callvirt генерируется компилятором C# вместо call в том контексте, где ссылка на экземпляр может потенциально быть null, даже если метод не виртуальный, чтобы обеспечить корректную проверку на null и генерацию NullReferenceException. Но для вызова метода экземпляра может использоваться и call.