Что происходит при создании нового объекта через оператор new в C#?

«Что происходит при создании нового объекта через оператор new в C#?» — вопрос из категории Управление памятью, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Оператор new инициирует процесс выделения памяти и инициализации экземпляра типа (класса или структуры). Для ссылочных типов (классов) это происходит так:

  1. Выделение памяти: Среда выполнения CLR выделяет непрерывный блок памяти в управляемой куче (managed heap) под все поля объекта. Если в куче недостаточно свободного места, запускается сборка мусора (GC).
  2. Инициализация памяти: Все поля объекта устанавливаются в значения по умолчанию (0, null, false).
  3. Вызов конструктора: Выполняется цепочка конструкторов (от базового класса к производному), которая инициализирует объект заданными значениями.
  4. Возврат ссылки: Оператор 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 является полем класса, она хранится в куче внутри памяти своего содержащего объекта.
  • Процесс инициализации (поля по умолчанию -> конструктор) аналогичен, но без выделения памяти в куче и без возврата ссылки (работа идет с самим значением).