1. Як правильно створити об’єкт
Оператор new у C# — це «магічна кнопка», що перетворює схематичне «креслення» (наш клас) на справжній екземпляр (об’єкт), з яким можна працювати. Простіше кажучи: клас визначає що об’єкт уміє та які має властивості, а new створює цей об’єкт у пам’яті комп’ютера.
Без оператора new наші класи були б чимось на кшталт креслень без будівель: можна милуватися, обговорювати, але ні пострибати, ні розлити чай на крісло з алькантари не вийде.
Якщо клас — це рецепт піци, то оператор new — кухар, який за цим рецептом створює справжню смачну піцу. Об’єкт же — результат його роботи: піца в коробці, яку вже можна з’їсти.
Синтаксис
Подивімося, як скористатися цим оператором new. Ось базовий синтаксис, якщо у нас є клас Contact:
Contact cont = new Contact();
- Contact ліворуч — це тип змінної, яку ми створюємо.
- cont — імʼя змінної (обирайте змістовні, щоб не страждати під час зневадження згодом).
- new Contact() — виклик оператора new, який створює об’єкт типу Contact.
У пам’яті
Коли виконується цей код, операційна система резервує частину пам’яті для нового об’єкта і повертає посилання (адресу), за якою цей об’єкт «живе». Це посилання зберігається у змінній cont.
Схема
+------------------+ +--------------------+
| змінна cont | ---------> | Об'єкт Contact |
+------------------+ +--------------------+
|
| (містить ім'я, телефон, email, ...)
|
адреса
2. Створюємо об’єкти контактів
У попередніх прикладах ми оголосили такий клас:
public class Contact
{
public string Name;
public string Phone;
public string Email;
}
Тепер створимо новий об’єкт типу Contact:
Contact friend = new Contact();
friend.Name = "Іван Петренко";
friend.Phone = "+380-99-123-45-67";
friend.Email = "ivan.petrenko@example.com";
Console.WriteLine($"Імʼя: {friend.Name}, Телефон: {friend.Phone}, Електронна пошта: {friend.Email}");
Що тут відбувається:
- Створюємо об’єкт за допомогою new Contact().
- Присвоюємо значення його полям.
- Виводимо дані на екран.
Приклад 2:
Додаймо роботу з кількома контактами — створимо ще один об’єкт:
Contact boss = new Contact();
boss.Name = "Анастасія Коваль";
boss.Phone = "+380-68-765-43-21";
boss.Email = "anastasia.koval@company.com";
Console.WriteLine($"Керівник: {boss.Name}, Телефон: {boss.Phone}");
Чи не нагадує це заповнення анкети для кожного знайомого? Саме так об’єкти і працюють: кожен створений екземпляр отримує свої унікальні значення й зберігає їх окремо від інших!
3. Використання масиву об’єктів
Якщо нам потрібно зберігати не один і не два, а, скажімо, десять контактів, логічно тримати їх у масиві:
Contact[] contacts = new Contact[3]; // масив для 3 об'єктів
contacts[0] = new Contact();
contacts[0].Name = "Денис";
contacts[0].Phone = "+380-91-111-22-33";
contacts[1] = new Contact();
contacts[1].Name = "Марія";
contacts[1].Phone = "+380-95-123-45-67";
contacts[2] = new Contact();
contacts[2].Name = "Петро";
contacts[2].Phone = "+380-92-543-21-00";
// Виведемо всіх на екран
for (int i = 0; i < contacts.Length; i++)
{
Console.WriteLine($"Контакт {i+1}: {contacts[i].Name}, {contacts[i].Phone}");
}
Важливо: ми використовуємо new для кожного елемента масиву! Просто створення масиву не створює самі об’єкти, а лише готує місце під посилання на них.
4. Оператор new і значення за замовчуванням
Іноді виникає запитання: якщо ви просто оголосите змінну типу Contact, але не присвоїте їй об’єкт за допомогою new, що станеться?
Contact someContact;
someContact.Name = "Помилка"; // Помилка компіляції!
Якщо ж ви напишете:
Contact someContact = null;
то під час спроби звернутися до someContact.Name ваша програма «впаде» з відомим винятком:
System.NullReferenceException: Посилання на об'єкт не вказує на екземпляр об'єкта.
Щоб цього уникнути, завжди ініціалізуйте об’єкти за допомогою new перед використанням.
5. Виклик конструктора
Коли ви пишете new Contact(), у цей момент викликається спеціальний метод — конструктор. Наразі наш клас явних конструкторів не містить, тому викликається неявний конструктор за замовчуванням, який створює об’єкт, а всі поля заповнює значеннями за замовчуванням (null для посилальних типів і нулем для числових).
У наступній лекції ви дізнаєтеся, як створювати власні конструктори — наприклад, одразу передавати імʼя і телефон. Поки що у нас працює лише конструктор без параметрів.
Приклади з реального життя
Робота з об’єктами через оператор new — це щоденна практика будь-якого C#-розробника. Уявімо, що ви:
- Створюєте користувача на сайті — у коді з’являється новий об’єкт User.
- Відкриваєте замовлення в інтернет-магазині — з’являється новий Order.
- Заносите дані про книгу — новий об’єкт Book.
У будь-якому сучасному застосунку на C# ви побачите тисячі рядків із оператором new.
Пам’ять до створення об’єкта
Contact firstContact; // Змінна, але ні на що не вказує
+--------------------------+
| firstContact |----> null (нічого!)
+--------------------------+
Після створення об’єкта
Contact firstContact = new Contact();
+--------------------------+ +----------------------+
| firstContact |---------------->| Об'єкт Contact |
+--------------------------+ +----------------------+
6. Практичний приклад
Припустімо, ми хочемо дозволити користувачеві створювати нові контакти через введення з клавіатури:
Console.WriteLine("Введіть імʼя:");
string name = Console.ReadLine();
Console.WriteLine("Введіть телефон:");
string phone = Console.ReadLine();
Contact newContact = new Contact();
newContact.Name = name;
newContact.Phone = phone;
Console.WriteLine($"Збережено контакт: {newContact.Name}, {newContact.Phone}");
Тепер кожне введення користувача створюватиме свій унікальний об’єкт у пам’яті, який можна зберігати, змінювати, виводити — робити з ним усе, що забажаєте!
7. Типові помилки і кумедні граблі
Помилка № 1: забули викликати new перед роботою з об’єктом.
Якщо оголосити змінну, але не ініціалізувати її, ви ризикуєте отримати або помилку компіляції, або NullReferenceException під час виконання. Це класика: оголосили об’єкт — одразу створіть його за допомогою new, якщо він вам реально потрібен.
Помилка № 2: створили масив об’єктів, але не створили самі об’єкти.
Ось поширена пастка: ви створюєте масив типу Contact[], але забуваєте, що всередині нього — просто набір null. Спроба звернутися до contacts[0].Name призведе до збою. Спочатку потрібно ініціалізувати кожен елемент масиву окремо: contacts[i] = new Contact();.
Помилка № 3: переплутали метод із властивістю.
Іноді новачки думають, що метод можна використовувати як поле: пишуть student.GetName замість student.GetName(). Це може не викликати помилки доти, доки ви не спробуєте використати результат; проте компілятор поскаржиться, щойно ви підставите «метод» туди, де очікують значення. Завжди перевіряйте: метод потрібно викликати з круглими дужками, навіть якщо він не приймає параметрів.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ