Если переменная private
, я часто не буду создавать для нее свойство. Если он каким-либо образом выставлен вне типа, я всегда выставляю его через свойство по разным причинам:
- Это может быть не нужно сегодня, но если это станет необходимым позже, это серьезное изменение
- Привязка данных работает только для свойств, а не для полей (я думаю, не большой пользователь привязки данных)
- Позволяет вставлять проверки, ведение журнала, точки останова при доступе к значению
Кроме того, если поле доступно через свойство, я всегда обращаюсь к нему через свойство, даже внутри класса.
Обновление
В ответ на ваши обновленные примеры кода: здесь есть несколько вещей, которые следует учитывать при разработке кода.
- Читаемость против скорости
- "атомарность"
- Другие побочные эффекты
Один типичный совет (который я считаю очень хорошим) - «пиши для ясности, проверяй на производительность». Это означает, что когда вы пишете свой код, вашей первой заботой должно быть, понятно ли, что делает код, глядя на него. Это часто (но не всегда) более важно, чем скорость кода. Напишите оптимизацию скорости, когда вы установили, где вы ее получаете. Доступ к свойству будет немного медленнее, чем непосредственное чтение поля, но в большинстве случаев разница будет незначительной (если вообще измеримой).
Атомность может быть проблемой. Учитывая ваш пример кода, у нас есть поле speed
, которое открыто публикуется через свойство Speed
. Если метод MultiplySpeed
должен выполнить несколько обновлений значения, эти промежуточные значения будут доступны через свойство Speed
в разное время, пока выполняется вычисление. Это верно независимо от того, обновляете ли вы поле напрямую или через свойство. В подобных случаях, возможно, лучше сначала поместить значение в локальную переменную, использовать его для вычислений и при необходимости присвоить значение этой переменной свойству.
Наконец, другие побочные эффекты. Возможно, что изменение значения Speed
должно вызвать событие (например, SpeedChanged
). В подобных случаях, вероятно, также не рекомендуется обновлять данные до тех пор, пока не будут выполнены расчеты.
Мне нравится думать о недвижимости как о контракте , а о поле - как реализация . Любой (за исключением ядра моего типа), которому нужно значение, должен использовать контракт. Опора на реализацию должна быть сделана, только если есть веские причины для обхода контракта.
И да, если вы инкапсулируете доступ к полю в свойстве, естественное изменение имени поля потребует меньше обновлений (и, возможно, имя поля станет менее важным).
Надеюсь, это имеет смысл, и это не так уж много не по теме;)