Что происходит "внутри" при обращении к статическому методу не статического класса?

Имеем не статический класс. Что происходит под капотом при первом и последующих вызовах статического метода этого класса? Язык - c#

Создаётся ли "единый" статический экземпляр класса?

Или код выполняется иным способом


Ответы (1 шт):

Автор решения: MSDN.WhiteKnight

Что происходит под капотом при первом и последующих вызовах статического метода этого класса? Язык - 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.

→ Ссылка