Почему выполнение свойства медленнее, чем выполнение поля или метода? - PullRequest
10 голосов
/ 06 февраля 2012

В CLR через CSharp глава 10 «Свойства» Джефф Рихтер пишет:

Метод свойства может занять много времени; доступ к полю всегда завершается немедленно. Распространенной причиной использования свойств является выполнить синхронизацию потока, которая может остановить поток навсегда, и, следовательно, свойство не должно использоваться, если поток требуется синхронизация. В этой ситуации метод является предпочтительным. Кроме того, если ваш класс может быть доступен удаленно (например, ваш класс является производным от System.MarshalByRefObject), вызывая свойство метод будет очень медленным, и поэтому метод предпочтительнее имущество. На мой взгляд, классы производные от MarshalByRefObject никогда не следует использовать свойства.

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

Чтобы прояснить мой вопрос:
Джефф, кажется, делает общее заявление о том, что свойства нежелательны и что методы предпочтительнее в этих двух сценариях. как отметил Джо Уайт, свойства могут иметь произвольный код. Но методы могут запускать один и тот же произвольный код. Это часть, с которой у меня проблемы. Есть ли на самом деле преимущество в использовании методов над свойствами (если используется тот же код) для синхронизации или маршалинга, или у него просто проблема с языковым соглашением?

Ответы [ 3 ]

9 голосов
/ 06 февраля 2012

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

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

(При этом медленное свойство будет явным нарушением .NET FrameworkРуководство по проектированию , а именно: «Используйте метод, а не свойство, [если] операция на несколько порядков медленнее, чем набор полей».)

Что касается его предложениявместо того, чтобы использовать методы, я не могу понять это.Свойства являются методами: свойство getter является методом (обычно называемым get_PropertyName), а setter свойства является методом (set_PropertyName), а код, который читает свойство, компилируется в код, который создаетвызов метода к get_PropertyName.Нет ничего особенного, что сделало бы свойство медленнее, чем метод.

5 голосов
/ 06 февраля 2012

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

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

Что касается производительности, то нет разницы между доступом к свойству и вызовом метода.На самом деле доступ к свойству это просто вызов метода.

3 голосов
/ 06 февраля 2012

Метод не быстрее свойства, но метод не должен быть таким же быстрым, как свойство.Таким образом, этот метод предпочтительнее, чтобы прояснить, что это может занять некоторое время (из-за синхронизации потоков в этом случае).

Поля вообще не «выполняются».Доступ к полю напрямую к памяти.

...