C # защищенное свойство или поле - PullRequest
22 голосов
/ 27 января 2010

Как вы думаете, лучше всегда делать защищенные члены класса автоматически реализуемым защищенным свойством, чтобы сохранить изоляцию или сделать его защищенным полем, достаточно?

protected bool test { get; set; }

или

protected bool test;

Ответы [ 5 ]

21 голосов
/ 27 января 2010

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

7 голосов
/ 27 января 2010

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

В C # автоматическая реализация свойства настолько проста, что нет причин этого не делать.

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

3 голосов
/ 01 августа 2013

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

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

  1. Когда наследующий класс должен читать, но никогда не должен изменять значение:

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

      protected readonly bool test;

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

      protected bool Test { get; private set; }

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

    protected bool test;

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

  1. Если его можно установить только один раз в конструкторе, используйте:

    readonly bool test;

  2. Если это может быть установлено в любом месте класса, используйте:

    bool test;

Кроме того, не забывайте, что если вы объявите его каксвойство, оно должно использовать PascalCase.Если вы объявите его как переменную-член, он должен использовать camelCase.Это облегчит другим разработчикам понимание области применения.

3 голосов
/ 27 января 2010

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

3 голосов
/ 27 января 2010

свойство, поддерживаемое приватным полем.

Этот вопрос может быть полезен

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