2

Конечно, проще сделать так:

public int _maxHP;
public int _maxMana;

Но можно сделать так:

[SerializeField] private int _maxHP;
[SerializeField] private int _maxMana;

public int GetMaxHP { get { return _maxHP; } } public int GetMaxMana { get { return _maxMana; } }

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

P.S. данные постоянно используются то там, то сям в разных скриптах.

A K
  • 28,718
  • 3
    public int maxHP {get;} ? Или {get; protected set;} – vp_arth Nov 16 '20 at 12:57
  • 1
    Если вы думаете об этом в терминах "private vs public мне использовать" — то ответ (та-дам!) очевиден: скрывайте, если нет необходимости снаружи класса. Но вы не видите другого аспекта вопроса: вы думаете "почему бы не использовать поля вместо свойств" (ну точнее вы даже не осознаёте пока разницу между полями и свойствами (не назывете их, не знаете краткой формы записи) и не понимаете, чем так плохо делать полями то, что нужно делать свойствами. Так что на мой взгляд предложенный в качестве дубликата вопрос вам когда-нибудь пригодится, когда дозреете. – A K Nov 16 '20 at 13:23

2 Answers2

2

Когда ты используешь private переменные, то ты не захламляешь "интерфейс" класса лишней информацией.

Каждую публичную переменную ты должен проверять на корректность прежде чем использовать, а вот при работе с private переменной ты работаешь на своей территории и некоторые проверки ты можешь опустить.

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

В общем, публичным должно быть то, что действительно должно быть публичным.

iluxa1810
  • 24,899
  • Можно пример того что ДОЛЖНО быть публичным? – Dead Lord Nov 16 '20 at 13:01
  • @DeadLord зависит от ситуации... Ну скажем, у тебя есть класс Person и тебе надо хранить возраст пользователя Age. Если ты сделаешь просто поле публичным, то пользователь сможет вбить туда отрицательный возраст или очень большое число далекое от реальности => можно сделать публичное свойство, где будет проверка допустимости значения. – iluxa1810 Nov 16 '20 at 13:04
  • Если у тебя в классе будет все публичным и без проверок, то ты вечно должен будешь держать в голове различные правила, а так ты спрятал правило, что возраст не должен быть отрицательным и если ошибешься где, то сразу вылетит ошибка при присвоении. – iluxa1810 Nov 16 '20 at 13:06
  • Благодарю! Действительно полезно) – Dead Lord Nov 16 '20 at 13:08
1

[SerializeField] только для тех полей, которые ты задаеш через инспектор, но не используются никем другим, как например ссылка на префаб [SerializeField] private GameObject _objectTamplate; или компоненты дочерних объектов в префабе [SerializeField] private Text _text.

public можно использовать по разному, например: public int Value { get; private set; } или protected set для наследников. В случаях когда, изменения только внутри класса и его кто-то должен читать, без возможности менять. Раздельные поле и свойство (get/set) только в случаях, когда поле сериализовано.

Для массивов изменяемых только внутри, но публично читаемые:

private String[] myArr = { "The", "quick", "brown", "fox" };
public IList<String> myList = Array.AsReadOnly(myArr);

private поля это исключительно внутренняя кухня класса.

Yaroslav
  • 7,040