Подтвердить что ты не робот

Защищенное свойство или поле С#

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

protected bool test { get; set; }

или

protected bool test;
4b9b3361

Ответ 1

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

Ответ 2

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

В С# автоматическое выполнение свойства так просто, нет причин не делать этого.

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

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

  • Когда класс наследования должен читать, но никогда не должен изменять значение:

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

      protected readonly bool test;

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

      protected bool Test { get; private set; }

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

    protected bool test;

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

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

    readonly bool test;

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

    bool test;

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