Ответ
Время жизни (lifetime) — это период, в течение которого переменная или объект занимает память и доступен для использования в программе. В C# время жизни управляется средой выполнения (CLR) и сборщиком мусора (Garbage Collector, GC).
Основные сценарии:
-
Локальные переменные в стеке: Живут до завершения выполнения блока (метода, цикла, условия).
void MyMethod() { int localVar = 42; // Время жизни — до закрывающей фигурной скобки метода. } -
Объекты в управляемой куче: Существуют, пока на них есть "живые" ссылки. GC освобождает память, когда объект становится недостижимым.
void CreateObject() { var obj = new MyClass(); // Время жизни начинается здесь. } // Когда метод завершится, ссылка `obj` выйдет из области видимости. // Объект становится кандидатом на удаление GC (но момент удаления недетерминирован). -
Использование
usingдляIDisposable: Гарантирует детерминированное время жизни и освобождение неуправляемых ресурсов.using (var fileStream = new FileStream("file.txt", FileMode.Open)) { // Ресурс `fileStream` живёт внутри этого блока. } // Здесь автоматически вызывается `Dispose()`, ресурс освобождается.
Ключевые нюансы:
- Статические поля: Существуют в течение всего времени жизни домена приложения.
ref struct(например,Span<T>): Не могут размещаться в куче, их время жизни жёстко ограничено стеком для обеспечения безопасности.- Утечки памяти: Возникают, когда объект больше не нужен, но на него остаётся ссылка (часто через статические поля, подписки на события или кэши). GC не может собрать такой объект.