Какие времена жизни объектов вы знаете в контексте C# и .NET?

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

Ответ

В .NET управление временем жизни объектов зависит от их типа и способа выделения памяти:

  1. Стек (Stack) — для типов значений (value types), таких как int, struct, и ссылок на объекты в куче. Память освобождается автоматически при выходе из области видимости (метода, блока кода).

  2. Управляемая куча (Managed Heap) — для ссылочных типов (reference types), таких как экземпляры классов. Создание:

    var obj = new MyClass(); // Выделение в управляемой куче

    Память освобождается сборщиком мусора (Garbage Collector, GC), который работает недетерминированно. Для оптимизации GC использует поколения (0, 1, 2) — новые объекты попадают в Gen 0, пережившие сборку мусора перемещаются в более старшие поколения.

  3. Неуправляемые ресурсы (Unmanaged Resources) — ресурсы вне контроля CLR (файловые дескрипторы, соединения с БД, дескрипторы окон). Требуют явного освобождения через реализацию интерфейса IDisposable и паттерн using:

    using (var fileStream = new FileStream("file.txt", FileMode.Open))
    {
        // Работа с ресурсом
    } // Dispose() вызывается автоматически здесь
  4. Статические поля / Жизненный цикл домена приложения (Application Domain) — объекты, связанные со статическими полями или сами домены приложений, живут до выгрузки домена, что обычно совпадает с завершением работы приложения.