← Назад к вопросам

Что такое getter?

1.0 Junior🔥 302 комментариев
#C# и ООП

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI7 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое геттер в Unity/C#?

В объектно-ориентированном программировании на C# и, соответственно, в Unity разработке, геттер (getter) — это специальный метод или аксессор, предназначенный для безопасного чтения значения приватного или защищённого поля класса. Он является частью механизма инкапсуляции — одного из фундаментальных принципов ООП, который скрывает внутреннее состояние объекта и предоставляет контролируемый доступ к данным.

Основная цель и преимущества геттера

Геттер не просто возвращает значение. Он реализует концепцию управляемого доступа:

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

Синтаксис в C#

В C# геттеры чаще всего реализуются через свойства (Properties). Это более элегантная замена методам GetX().

1. Простейшее автоматическое свойство (auto-property): Здесь компилятор сам создаёт скрытое приватное поле и реализует геттер.

public int Health { get; private set; } // Геттер публичный, сеттер приватный

2. Свойство с полной реализацией (full property): Позволяет добавить собственную логику в геттер и/или сеттер.

private float _speed;

public float Speed
{
    get
    {
        // Можно добавить дополнительную логику:
        // if (IsBoosted) return _speed * 1.5f;
        return _speed;
    }
    private set { _speed = value; }
}

3. Геттер только для чтения (read-only property): Инициализируется только в конструкторе.

public string PlayerId { get; }
public Player(string id) { PlayerId = id; }

Практический пример из Unity

Предположим, у нас есть компонент PlayerStats. Без инкапсуляции все поля были бы публичными, что опасно.

Плохой подход (нарушение инкапсуляции):

public class PlayerStats : MonoBehaviour
{
    public float currentHealth; // Любой другой код может изменить это напрямую!
}

Хороший подход с использованием геттера:

public class PlayerStats : MonoBehaviour
{
    [SerializeField] private float _currentHealth; // Поле приватное и настраивается в Inspector
    [SerializeField] private float _maxHealth;

    // Публичный геттер предоставляет доступ ТОЛЬКО для чтения
    public float CurrentHealth => _currentHealth;

    // Геттер может вычислять значение
    public float HealthRatio => _currentHealth / _maxHealth;

    // Метод для контролируемого изменения здоровья
    public void TakeDamage(float damage)
    {
        _currentHealth = Mathf.Max(_currentHealth - damage, 0);
        // Здесь можно вызвать событие OnHealthChanged, проверить смерть и т.д.
    }
}

В этом примере:

  • Внешние классы (например, UIHealthBar) могут читать CurrentHealth и HealthRatio через геттеры.
  • Изменить же значение _currentHealth можно только через предусмотренные методы класса (TakeDamage, Heal), что гарантирует корректность состояния (здоровье не уйдёт в минус, вызовутся нужные события).

Итог

Геттер — это не просто синтаксический сахар, а важнейший инструмент для создания надёжного, безопасного и сопровождаемого кода в Unity. Он защищает целостность данных объекта, позволяет гибко управлять доступом и является стандартом в профессиональной разработке на C#. В Unity его использование критически важно для создания чистых архитектур, например, при работе с моделью данных в паттерне MVC/MVVM.