Есть ли в C # встроенные свойства? - PullRequest
12 голосов
/ 15 марта 2009

Имеет ли C # встроенный доступ к свойствам? Мне известно о 32-байтовом (инструкции?) Пределе для JIT для встраивания, но будут ли это встроенные свойства или просто pure вызовы метода?

Ответы [ 4 ]

24 голосов
/ 15 марта 2009

Это зависит от JIT (насколько мне известно, компилятор C # не делает никаких вставок), но я считаю, что в большинстве случаев JIT встроит тривиальные свойства.

Обратите внимание, что не будет встроенными членами типов, производных от MarshalByRefObject, включая System.Windows.Forms.Control (через System.ComponentModel.Component).

Я также видел, что double поля оказываются менее эффективными при доступе через свойства - возможно, в этом есть некоторые тонкости (из-за использования регистра и т. Д.).

Также обратите внимание, что 64-битные и 32-битные JIT отличаются, включая их обработку того, что становится встроенным.

РЕДАКТИРОВАТЬ: Я только что нашел запись в блоге 2004 Дэвидом Нотарио с некоторой дополнительной информацией. Тем не менее, это было до выпуска 2.0 - я не удивлюсь, увидев, что по крайней мере некоторые изменились. В любом случае может представлять интерес.

РЕДАКТИРОВАТЬ: Другой вопрос относится к записи в блоге Vance Morrison 2008 , которая дает больше информации. Интересные вещи.

8 голосов
/ 15 марта 2009

Доступ к свойству - это просто вызов метода. Нет разницы в IL, который генерирует компилятор для доступа к свойству и для вызова метода с аналогичной сигнатурой, что как бы отвечает на ваш вопрос.

5 голосов
/ 15 марта 2009

Мне потребовалось некоторое время, чтобы понять, что в Visual Studio вы можете просматривать разборку управляемого кода, после , JIT компилирует его.

Так почему бы не создать класс с очень простым свойством метода доступа, запустить его в режиме выпуска, установить точку останова и посмотреть, что говорит дизассемблирование?

4 голосов
/ 15 марта 2009

Я недавно опубликовал похожий вопрос:

Почему открытые поля быстрее свойств?

Проблема с моим состояла в том, что открытое поле было быстрее, чем свойство, потому что я использую 64-битную Vista, и JIT также скомпилировал мой код в 64-битный, и мои свойства были не в подкладке. Принуждение проекта к компиляции для x86 выполняло встроенное свойство, и не было никакой разницы в скорости между свойством и открытым полем.

Итак, 32-битный JIT C # имеет встроенные свойства, 64-битный - нет, как и любые другие нестатические методы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...