Подтвердить что ты не робот

Имеет ли встроенные свойства С#?

Предоставляет ли С# встроенный доступ к свойствам? Я знаю ограничение 32 байта (инструкции?) На JIT для встраивания, но будут ли он встроенными свойствами или просто чистыми вызовами метода?

4b9b3361

Ответ 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-разрядный - нет, а также любые другие нестатические методы.