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 = "+1-999-123-45-67";
friend.Email = "ivan@example.com";
Console.WriteLine($"Имя: {friend.Name}, Телефон: {friend.Phone}, Email: {friend.Email}");
Что здесь происходит:
- Создаём объект с помощью new Contact().
- Присваиваем значения его полям.
- Выводим данные на экран.
Пример 2:
Давайте добавим работу с несколькими контактами — создадим ещё один объект:
Contact boss = new Contact();
boss.Name = "Анастасия Сергеевна";
boss.Phone = "+1-888-765-43-21";
boss.Email = "nastya@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 = "+7-911-111-22-33";
contacts[1] = new Contact();
contacts[1].Name = "Мария";
contacts[1].Phone = "+7-915-123-45-67";
contacts[2] = new Contact();
contacts[2].Name = "Петр";
contacts[2].Phone = "+7-921-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(). Это сработает, если не пытаться использовать результат сразу — но компилятор начнёт ругаться, если вы попытаетесь подставить "метод" туда, где ожидается значение. Всегда проверяйте: метод должен вызываться с круглыми скобками, даже если он не принимает параметров.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ