Свойства C #: как они создаются? - PullRequest
1 голос
/ 17 июня 2009

Это может быть довольно простой вопрос, но я пытаюсь понять некоторые внутренние принципы компиляции.

Проще говоря, представьте себе, как создается объект . Этот объект затем размещается в куче. У объекта есть свойство типа PointF (которое является типом значения) с методом get и set.

Представьте метод get и set, содержащий несколько вычислений для выполнения своей работы. Как и где (стек / куча) и когда создается этот код?

<ч />

Это фон для этого вопроса:

Я пишу методы get и set для объекта, и к этим методам нужно обращаться очень часто. Сам по себе код get и set довольно массивный, поэтому я опасался, что в худшем случае методы будут созданы как объект или тип значения со всем внутренним кодом для каждого доступа к свойству. С другой стороны, код, вероятно, создается при создании основного объекта, а ЦПУ просто передается jmp для запуска кода свойства. Во всяком случае, это то, что я хочу уточнить.

Ответы [ 6 ]

8 голосов
/ 17 июня 2009

Методы (или свойства) не создаются. Вы, кажется, думаете, как я когда-то делал - создание экземпляра класса не только выделяет пространство для данных, но и для кода. Это не правда.

Даже в C ++ способ, которым это будет работать, заключается в том, что данные будут выделяться вместе с указателем на массив указателей функций - таблицу виртуальных функций или vtable. Записи в vtable будут указывать на виртуальные методы. Не виртуальным методам не потребуется запись в vtable.

В любом случае была только одна копия кода, независимо от того, сколько объектов было создано.

3 голосов
/ 17 июня 2009

Исполняемый код не выделяется ни в стеке, ни в куче, он компилируется JIT'ером, когда это необходимо, и соответствующая память выделяется один раз . То есть вы беспокоитесь о том, что по сути не является проблемой. Кроме того, не пытайтесь угадать, что делает сборщик мусора в отношении выделения памяти - он поможет вам избавиться от беспокойства.

3 голосов
/ 17 июня 2009

У меня здесь нет моей копии CLR через C # , но методы получения и установки свойств - это просто методы в классе со специальным оформлением. Отличная книга Джеффри Рихтера будет содержать все мельчайшие детали.

1 голос
/ 17 июня 2009

Я не уверен, что вы подразумеваете под экземпляром, но если вы беспокоитесь о времени работы геттера, вы можете подумать о кэшировании ответа. Я бы не стал этого делать, пока не проверил, что получатель действительно влияет на производительность вашей программы.

1 голос
/ 17 июня 2009

Они ничем не отличаются от методов.

0 голосов
/ 20 июня 2009

Согласно эта страница свойств и методов MSDN имеет некоторые существенные различия. Особенно, когда речь идет о возврате массивов, свойства производят поверхностную копию всего массива перед возвратом, так что это одна из ситуаций, когда вы хотите использовать вместо нее пользовательскую функцию.

Однако, как я объяснил выше, я хотел знать, будет ли программа страдать от снижения производительности, если я каким-либо образом использую свойства вместо функций. В целом я обнаружил, что свойства по какой-то необъяснимой причине в среднем примерно на 5% медленнее, чем функции. Это может быть потому, что свойства могут похвастаться целым рядом «невидимых» объектов, таких как дескрипторы свойств и тому подобное. Кроме того, реализации кажутся довольно похожими.

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