Что такое время жизни (lifetime) в контексте управления памятью?

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

Ответ

Время жизни (lifetime) — это период, в течение которого переменная или объект занимает память и доступен для использования в программе. В C# время жизни управляется средой выполнения (CLR) и сборщиком мусора (Garbage Collector, GC).

Основные сценарии:

  1. Локальные переменные в стеке: Живут до завершения выполнения блока (метода, цикла, условия).

    void MyMethod() {
        int localVar = 42; // Время жизни — до закрывающей фигурной скобки метода.
    }
  2. Объекты в управляемой куче: Существуют, пока на них есть "живые" ссылки. GC освобождает память, когда объект становится недостижимым.

    void CreateObject() {
        var obj = new MyClass(); // Время жизни начинается здесь.
    } // Когда метод завершится, ссылка `obj` выйдет из области видимости.
      // Объект становится кандидатом на удаление GC (но момент удаления недетерминирован).
  3. Использование using для IDisposable: Гарантирует детерминированное время жизни и освобождение неуправляемых ресурсов.

    using (var fileStream = new FileStream("file.txt", FileMode.Open)) {
        // Ресурс `fileStream` живёт внутри этого блока.
    } // Здесь автоматически вызывается `Dispose()`, ресурс освобождается.

Ключевые нюансы:

  • Статические поля: Существуют в течение всего времени жизни домена приложения.
  • ref struct (например, Span<T>): Не могут размещаться в куче, их время жизни жёстко ограничено стеком для обеспечения безопасности.
  • Утечки памяти: Возникают, когда объект больше не нужен, но на него остаётся ссылка (часто через статические поля, подписки на события или кэши). GC не может собрать такой объект.