1. Основні модифікатори доступу в C#
Коли ви пишете програму, часто потрібно чітко контролювати, хто і звідки може бачити або змінювати ваші змінні та викликати методи. Це як у багатоквартирному будинку: не всі приміщення відкриті для всіх. До одних мають доступ лише мешканці, а до інших — тільки спеціалісти з обслуговування.
У програмуванні цей «контроль доступу» забезпечується через модифікатори доступу. Вони визначають, чи видно член класу (змінну, поле, метод, властивість тощо) поза класом, в іншому класі чи в іншому проєкті. Це одна з головних реалізацій інкапсуляції в ООП: ми ховаємо деталі реалізації, надаючи назовні лише потрібні «інтерфейси».
Ось таблиця з основними модифікаторами та коротким описом:
| Модифікатор | Де видно? (простими словами) |
|---|---|
|
Скрізь (у межах проєкту й поза ним — якщо підключено збірку) |
|
Лише всередині того самого класу |
|
Те саме, що й private |
Здається складно? Насправді все простіше, ніж виглядає. Розберімося на прикладах, де який модифікатор краще використовувати.
2. Модифікатор public — відкритий для всіх
Модифікатор public робить вашу змінну або метод видимими скрізь. Якщо ви оголосили член класу як public, до нього можна звернутися з будь-якого іншого коду, який бачить ваш клас.
public class Person
{
public string Name;
public void SayHello()
{
Console.WriteLine($"Привіт! Мене звати {Name}");
}
}
Тепер де завгодно — у тому самому проєкті або навіть в інших (якщо додати посилання на збірку) — можна написати:
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
}
}
Тут 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
}
}
У цьому прикладі, коли ми пишемо 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 — поле класу
}
}
Затінення може заплутувати, тому варто давати змінним виразні, різні імена — особливо якщо ви працюєте у великих командах.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ