stsfld против stfld - PullRequest
       33

stsfld против stfld

2 голосов
/ 09 августа 2011

Глядя на разницу между кодами il stfld и stsfld, stfld имеет нулевую проверку ссылок, а stsfld - нет.Почему это?Это потому, что статические поля находятся в высокочастотной куче и поэтому не являются сборщиком мусора?

http://msdn.microsoft.com/library/system.reflection.emit.opcodes.stfld.aspx

Переходное поведение стека в последовательном порядке:

  1. Ссылка на объект или указатель помещаются в стек.
  2. Значение помещается в стек.
  3. Значение и указатель / указатель объекта извлекаются из стека;значение поля в объекте заменяется предоставленным значением.

Инструкция stfld заменяет значение поля объекта (тип O) или через указатель (тип native int, &,или *) с заданным значением.Поле - это токен метаданных, который ссылается на ссылку на элемент поля.Инструкция stfld может иметь префикс либо Unaligned, либо Volatile одного или обоих.

NullReferenceException генерируется, если ссылка на объект или указатель является нулевой ссылкой, а поле не является статическим.

MissingFieldExceptionвыбрасывается, если поле не найдено в метаданных.Обычно это проверяется, когда инструкция Microsoft Intermediate Language (MSIL) преобразуется в собственный код, а не во время выполнения.

1 Ответ

7 голосов
/ 09 августа 2011

Статические члены никогда не имеют целевой экземпляр.Если есть параметры (для метода), arg0 ссылается на первый параметр, а не на целевой экземпляр (он же this).Поскольку нет целевого экземпляра, проверка на ноль не имеет смысла: нет ничего, чтобы разыменовать.

...