Есть ли разница в производительности между свойствами и вспомогательными полями в операциях чтения / записи?

Работая с классом над его собственными полями и свойствами, я обычно использую это свойство только тогда, когда оно выполняет какую-то функцию (например, ограничение значения или проверку или что-то еще). В противном случае я предпочитаю читать / писать поле поддержки напрямую.

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

Помимо соглашения или вкуса, существует ли фактический фактор эффективности между одним и другим методами?

4 ответа

Решение

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

Тем не менее, get/sets может включать в себя любую логику, которую они хотят, поэтому может быть дорогостоящим - однако, рекомендации часто советуют держать их легкими.

Свойства имеют несколько преимуществ, даже если они просто получают / устанавливают обложки:

  • Привязка данных может видеть только свойства, а не поля.
  • Это соответствует концепции инкапсуляции.
  • Вы можете использовать семантику только для чтения или только для записи.
  • Вы можете применять атрибуты отдельно к базовому полю (полезно в сценариях сериализации).

Кроме того, хотя интересно рассмотреть мельчайшие характеристики производительности этих вещей - в производственном коде применение этого типа оптимизации (ну, в данном случае его нет), вероятно, попадет под знамя преждевременной оптимизации.

Это действительно зависит. Технически это может быть медленнее, но даже в этих случаях это будет почти неприемлемо. Вот правила работы метода встраивания, взятые отсюда.

  • Методы, которые превышают 32 байта IL, не будут встроены.
  • Виртуальные функции не встроены.
  • Методы, которые имеют сложное управление потоком, не будут встроены. Комплексное управление потоком - это любое управление потоком, кроме if / then / else; в этом случае переключитесь или пока.
  • Методы, которые содержат блоки обработки исключений, не являются встроенными, хотя методы, которые генерируют исключения, все еще являются кандидатами для встраивания.
  • Если какой-либо из формальных аргументов метода является структурой, метод не будет встроенным.

Поскольку компилятор C# создает отдельные методы getter и setter из объявления свойства, они, очевидно, будут обрабатываться независимо друг от друга. Исходя из приведенных выше правил, я бы сказал, что большинство методов доступа к свойствам встроены. Я думаю, что правило о том, что методы должны быть не виртуальными, было бы одним из нетривиальных показов, которые часто встречаются.

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

Если класс или структура предоставляют изменяемое поле типа структуры, можно получить доступ к отдельным полям этой структуры без необходимости копировать все это. Напротив, если оно предоставляет свойство (изменяемое или нет) или поле "только для чтения", то доступ к любой части структуры приведет к тому, что система скопирует всю структуру, а затем получит доступ к копии. Кроме того, потребительский код может модифицировать поле открытого структурного поля удобно и эффективно без каких-либо избыточных операций копирования. В отличие от этого, если структура представлена ​​как свойство, изменение любой ее части потребует от потребителя скопировать ее во временную переменную, внести изменения, а затем сохранить ее, последовательность шагов, которая, вероятно, приведет к возникновению всей структуры. копироваться четыре раза (по одному поставщику и потребителю при чтении и по одному при записи).

Другие вопросы по тегам