Какой смысл делать отдельные публичные функции для получения/установки приватного значения?

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

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

Тем не менее, часто я вижу, что другой код использует частные значения в своем классе, а затем создает отдельные функции для получения и установки значения, например:

private bool fooBar;

public void SetFooBar(bool boolean)
{
   fooBar = boolean;
}

public bool GetFooBar()
{
   return fooBar;
}

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

В C# вы должны использовать свойства вместо методов Get/Set, но общий смысл заключается в том, чтобы скрыть реализацию того, как значение сохраняется внутри, и упростить внесение некритических изменений.

juharr 29.05.2019 18:38

Обычно вы не должны создавать поле public, но должны сделать его общедоступным (например: public bool FooBar { get; set; }). Использование методов для получения и установки не характерно для С#.

Rufus L 29.05.2019 18:41
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
2
63
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий
  1. Потому что прямое изменение состояния объекта в ООП запрещено.
  2. Потому что вы не можете поместить поля в интерфейс (и как только вы зайдете достаточно далеко, вы обычно получите доступ к большинству других объектов через интерфейсы)
  3. Потому что он допускает дополнительную логику (например, создание событий), когда другой объект хочет взаимодействовать с полем.
  4. Поскольку некоторые вещи (например, привязки WPF) работают только со свойствами, а не с полями.

  5. Поскольку вы можете захотеть изменить способ извлечения/сохранения значения (не только в памяти) позже

(Обратите внимание, что в C# вы обычно делаете это как свойство, а не методы, как public bool Foo {get; set;})

Спасибо за информацию, в следующий раз сделаю это через свойства. Я где-то читал, что смысл делать это с помощью метода заключался в том, чтобы поле оставалось закрытым, и что вы хотите, чтобы они были закрытыми по соображениям безопасности или что-то в этом роде (?). Тем не менее, если я использую public bool Foo {get; set;}, то я, по сути, делаю это общедоступным полем, верно?

Mathue24 29.05.2019 19:07

Моя ошибка, я имел в виду, что если я использую public bool Foo {get; set;}, то я делаю его общедоступным, но чем оно отличается от публичного поля?

Mathue24 29.05.2019 19:13

@ Mathue24 Mathue24 На самом деле это не причина «безопасности» (особенно потому, что к закрытым членам можно получить доступ через отражение, несмотря ни на что), а скорее причина «хорошего дизайна». Свойства отличаются от полей в пунктах 2, 3, 4 и 5 моего ответа. Свойства Авто (то, что я перечислил) различаются в 2 и 4

BradleyDotNET 29.05.2019 19:15

Это позволяет изменить способ хранения значения независимо от того, как к нему обращаются внешние пользователи.

Используя функции Getter и Setter, вы можете запрашивать данные из локального кеша или извлекать их из базы данных.

C# поддерживает реализации функций Getter Setter с использованием метода доступа к стилю свойства.

private bool _fooBar
public bool FooBar
{
 get { return _fooBar; }
 set {  _fooBar = value; }
}

Как упоминалось в комментариях БрэдлиДотНЕТ, вы можете написать их так, как напоминает лямбды, начиная с C# 7.0.

private bool _fooBar
public bool FooBar
{
    get => _fooBar;
    set => _fooBar = value;
}

Как упоминалось в БрэдлиДотНЕТ, вы можете написать эту точную реализацию как

public bool FooBar { get; set; }

Который будет действовать так же.

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

public bool FooBar { get; protected set; }

А с C# 7 получить можно get => _fooBar

BradleyDotNET 29.05.2019 18:46

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