Ответ
Оператор new инициирует процесс выделения памяти и инициализации экземпляра типа (класса или структуры). Для ссылочных типов (классов) это происходит так:
- Выделение памяти: Среда выполнения CLR выделяет непрерывный блок памяти в управляемой куче (managed heap) под все поля объекта. Если в куче недостаточно свободного места, запускается сборка мусора (GC).
- Инициализация памяти: Все поля объекта устанавливаются в значения по умолчанию (
0,null,false). - Вызов конструктора: Выполняется цепочка конструкторов (от базового класса к производному), которая инициализирует объект заданными значениями.
- Возврат ссылки: Оператор
newвозвращает ссылку (адрес в памяти) на созданный объект. Эта ссылка хранится в переменной.
Пример кода:
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
public Person(string name, int age)
{
Name = name; // Инициализация в конструкторе
Age = age;
}
}
// Процесс создания:
Person person = new Person("Alice", 30);
// 1. Выделена память в куче для полей Name (ссылка) и Age (int).
// 2. Поля установлены в null и 0.
// 3. Вызван конструктор Person("Alice", 30).
// 4. В переменную 'person' помещена ссылка на этот блок памяти.
Важные отличия для значимых типов (struct):
- Для локальных переменных
structпамять выделяется в стеке вызовов. - Когда
structявляется полем класса, она хранится в куче внутри памяти своего содержащего объекта. - Процесс инициализации (поля по умолчанию -> конструктор) аналогичен, но без выделения памяти в куче и без возврата ссылки (работа идет с самим значением).