Следует ли обращаться к переменной в том же классе через свойство?

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

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

Или это просто вопрос стандартов кодирования, используемых в проекте?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
26
0
5 427
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

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

Когда вы переходите непосредственно к частному полю, вы знаете, что в поле устанавливается именно то, что вы говорите.

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

Довольно сложно придумать правило о том, когда выполнение любого из них является «правильным», и я бы сказал, что единственное, чему я следую, - это то, что при инициализации конструктора я почти никогда не буду использовать свойство.

Хорошая точка зрения. Используйте это поле, если вы хотите обойти логику в свойстве.

Brannon 07.11.2008 08:44

Думаю, это чисто предпочтение.

Тем не менее, я обнаружил, что использую свойства намного больше в C# 3.0 с поддержкой авто-свойств:

class Foo {
    public string Value { get; set; }

    public void Write() {
        Console.Write(Value);
    }
}

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

David Hall 07.11.2008 08:48

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

Adrian Clark 07.11.2008 08:56

Да, я знаю, мне интересно, означают ли автоматические свойства (и всегда их использование), что, когда реализована логика установщика, она с большей вероятностью будет упущена из виду и вызовет проблемы. Не техническая проблема, просто вопрос «Что может заставить меня сделать глупую ошибку?»

David Hall 07.11.2008 08:59

Обычно в зависимости от стандартов кодирования проекта я использую "_" или "m" перед именем для атрибутов моего частного класса. (Как показано ниже)

private int mVariable;
private int _Variable;

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

_ делает их несовместимыми с CLS, я считаю

TheCodeJunkie 07.11.2008 08:50

Соответствие @Selfinflicted CLS применяется только к общедоступным полям / методам / т. Д. Даже если соответствие CLS действительно применялось, внутренние имена полей удаляются при сборке в режиме выпуска в любом случае, поэтому нет никаких причин, которые имели бы значение.

Eric Haskins 07.11.2008 09:17
Ответ принят как подходящий

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

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

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

С введением автоматических свойств стало еще меньше причин явно иметь локальную переменную, если только вам не нужно применять бизнес-правила для получения / установки.

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

Alan 07.11.2008 11:09

Да, я думаю, вам следует по возможности использовать внутренние свойства в своих классах. Свойства более гибкие и позволяют добавлять логику для проверки их значения в центральном месте.

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

class Test {
   private int _checksum = -1;
   private int Checksum {
      get {
         if (_checksum == -1)
            _checksum = calculateChecksum();
         return checksum;
      }
   }
}

Всегда используйте свойства, вот некоторые из причин

  1. Легко использовать. В Visual Studio вы можете использовать «Вкладка Prop Tab». Вы получите фрагмент ресурса
  2. Свойства - это языковые элементы, к которым осуществляется доступ, как если бы они были членами данных.
  3. Классы .NET Framework используют его, классы кода привязки данных в свойствах поддержки .NET Framework,
  4. Свойства обладают всеми языковыми особенностями методов. Свойства могут быть виртуальными

Я думаю, вы неправильно поняли вопрос.

Meta-Knight 23.01.2013 22:42

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