JavaRush /Курси /C# SELF /Модифікатори доступу та область видимості

Модифікатори доступу та область видимості

C# SELF
Рівень 8 , Лекція 5
Відкрита

1. Основні модифікатори доступу в C#

Коли ви пишете програму, часто потрібно чітко контролювати, хто і звідки може бачити або змінювати ваші змінні та викликати методи. Це як у багатоквартирному будинку: не всі приміщення відкриті для всіх. До одних мають доступ лише мешканці, а до інших — тільки спеціалісти з обслуговування.

У програмуванні цей «контроль доступу» забезпечується через модифікатори доступу. Вони визначають, чи видно член класу (змінну, поле, метод, властивість тощо) поза класом, в іншому класі чи в іншому проєкті. Це одна з головних реалізацій інкапсуляції в ООП: ми ховаємо деталі реалізації, надаючи назовні лише потрібні «інтерфейси».

Ось таблиця з основними модифікаторами та коротким описом:

Модифікатор Де видно? (простими словами)
public
Скрізь (у межах проєкту й поза ним — якщо підключено збірку)
private
Лише всередині того самого класу
(немає модифікатора)
Те саме, що й private

Здається складно? Насправді все простіше, ніж виглядає. Розберімося на прикладах, де який модифікатор краще використовувати.

2. Модифікатор public — відкритий для всіх

Модифікатор public робить вашу змінну або метод видимими скрізь. Якщо ви оголосили член класу як public, до нього можна звернутися з будь-якого іншого коду, який бачить ваш клас.

public class Person
{
    public string Name;
    public void SayHello()
    {
        Console.WriteLine($"Привіт! Мене звати {Name}");
    }
}
Приклад класу з public полем і методом

Тепер де завгодно — у тому самому проєкті або навіть в інших (якщо додати посилання на збірку) — можна написати:

Person p = new Person();
p.Name = "Аліса";
p.SayHello();

Практична порада: не робіть усе підряд public — так ви ризикуєте безпекою коду.

3. Модифікатор private — це приватна власність!

Модифікатор private закриває доступ до вмісту класу: ніхто ззовні не побачить, що там, і не змінить дані. За замовчуванням усі поля та методи класів у C# — private, якщо ви не вказали інший модифікатор.

public class Cup
{
    private double volume; // Це поле бачить лише сам клас Cup

    public void Fill(double value)
    {
        volume = value; // Можна використовувати всередині класу
    }

    public double GetVolume()
    {
        return volume; // А ззовні ніхто не дізнається про саме поле volume
    }
}
Приклад використання private поля

Тут volume прихований від усіх інших, але використовувати його може будь-який метод усередині Cup. Щоб дізнатися обʼєм, ми надаємо публічний метод GetVolume().

4. Область видимості: змінні, методи та класи

Область видимості — це частина програми, де імʼя (змінної, методу, класу) має сенс і є доступним.

  • Локальні змінні (оголошені всередині методу або блоку коду): видимі тільки в цьому методі або блоці.
  • Параметри методів: видимі лише всередині методу.
  • Поля класу: видимі скрізь у межах класу (з урахуванням модифікатора доступу).
  • Класи: вкладений клас видно лише в класі-обгортці, якщо він private, тощо.

Подивімося на приклад з областю видимості:

public class Counter
{
    private int count = 0; // Видно скрізь у класі

    public void Increment()
    {
        count++;   // Можемо використовувати поле
        int temp = count * 2; // temp видно лише всередині Increment
    }

    public int GetCount()
    {
        // temp тут не видно!
        return count;
    }
}
Приклад області видимості змінних

Якщо ви спробуєте звернутися до temp усередині GetCount(), отримаєте помилку.

5. Затінення змінних (shadowing)

Затінення — це ситуація, коли в одній області видимості оголошують змінну (або параметр) з тим самим імʼям, що й у зовнішній області. Усередині цього блоку «нове» імʼя затінює старе, і до зовнішнього значення вже не можна звернутися безпосередньо.

Приклад затінення:

class ShadowDemo
{
    int value = 10; // Поле класу

    void PrintValue()
    {
        Console.WriteLine(value);      // 10 — поле класу
        int value = 5; // Локальна змінна затінює поле класу
        Console.WriteLine(value); // Виведе 5, а не 10
    }
}
Приклад затінення змінної (shadowing)

У цьому прикладі, коли ми пишемо int value = 5;, це затінює поле класу з тим самим імʼям у межах методу. Під час звернення до value усередині PrintValue() буде використано локальну змінну, а не поле класу.

Якщо все ж потрібно звернутися до поля класу, скористайтеся ключовим словом this:

class ShadowDemo
{
    int value = 10;

    void PrintValue()
    {
        Console.WriteLine(value);      // 10 — поле класу
        int value = 5;
        Console.WriteLine(value);      // 5 — локальна змінна
        Console.WriteLine(this.value); // 10 — поле класу
    }
}
Використання this для звернення до поля класу під час затінення

Затінення може заплутувати, тому варто давати змінним виразні, різні імена — особливо якщо ви працюєте у великих командах.

1
Опитування
Функції, рівень 8, лекція 5
Недоступний
Функції
Вступ до функцій
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ