Предоставляет ли С# встроенный доступ к свойствам? Я знаю ограничение 32 байта (инструкции?) На JIT для встраивания, но будут ли он встроенными свойствами или просто чистыми вызовами метода?
Имеет ли встроенные свойства С#?
Ответ 1
Это до JIT (компилятор С# не делает какой-либо вставки, насколько мне известно), но я считаю, что JIT в большинстве случаев будет включать в себя тривиальные свойства.
Обратите внимание, что он не будет встраивать элементы типов из MarshalByRefObject
, который включает System.Windows.Forms.Control
(через System.ComponentModel.Component
).
Я также видел, что поля double
становятся менее эффективными при доступе через свойства - возможно, это связано с некоторыми тонкостями (из-за использования регистра и т.д.).
Также обратите внимание, что 64-разрядные и 32-разрядные JIT файлы отличаются друг от друга, в том числе их обработка того, что становится вложенным.
EDIT: Я только что нашел запись в блоге в 2004 году Дэвида Нотарио с дополнительной информацией. Тем не менее, это было до поставки 2.0 - я не удивлюсь, увидев, что по крайней мере некоторые из них изменились. В любом случае, это может представлять интерес.
EDIT: Другой вопрос относится к 2008 в блоге Vance Morrison, который дает больше информации. Интересный материал.
Ответ 2
Доступ к свойствам - это просто вызов метода. Нет никакой разницы в IL, который компилятор испускает для доступа к свойствам, и для вызова метода с аналогичной сигнатурой, который отвечает на ваш вопрос.
Ответ 3
Мне потребовалось некоторое время, чтобы понять, что в Visual Studio вы можете просмотреть разбор управляемого кода после, который JIT компилирует.
Итак, почему бы не создать класс с очень простым свойством accessor, запустить его в режиме деблокирования, установить точку останова и посмотреть, что говорит разборка?
Ответ 4
Недавно я опубликовал аналогичный вопрос:
Почему открытые поля быстрее, чем свойства?
Проблема с моим была в том, что публичное поле было быстрее, чем свойство, потому что я запускаю 64-битную Vista, а JIT скомпилировал мой код и в 64-битный, а мои свойства были не внутри. Принуждение проекта к компиляции для x86 делало в строке свойство и не было разницы в скорости между свойством и публичным полем.
Итак, 32-разрядный JIT С# имеет встроенные свойства, 64-разрядный - нет, а также любые другие нестатические методы.