Как уничтожаются объекты и надо ли их самому уничтожать?

Вот пример кода.
public static string GetLastFolderName(string filePath)
{
FileInfo fileInfo = new FileInfo(filePath);
return fileInfo.Directory.Name;
}

В коде создается новый экземпляр класса.

В отличии от Delphi, вопрос уничтожения объектов в C# не рассматривается, по крайней мере на начальном и среднем уровне изучения языка. Говорят, что всё делается автоматически.
(в Delphi мы это делаем сами, "руками" и часто если забыл удалить объект, это приводит к ошибкам)

Как виртуальная машина .NET понимает, что объект пора уничтожать? И когда это происходит?
Ведь я могу обратиться к нему в любое время, например запустить приложение на C# и через день обратится к нему из другого сервиса/приложения.

Что будет если нужно выполнить код выше в цикле? То есть будет создано множество объектов.
По идее они мне в дальнейшем не нужны. Как только я получил return (имя папки), этот объект мне не нужен.
И если всё это в цикле, логично будет сразу уничтожить объект.

Как уничтожаются объекты и надо ли их самому уничтожать?
  • Вопрос задан
  • 454 просмотра
Решения вопроса 1
nozd
@nozd
C#
CLRium #5: Garbage Collector. 2019 год
Расширяет понимание работы GC, выделения и использования памяти и т.п. Но без предварительно чтения соответствующего материала, например, у Рихтера, понять будет сложно.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
Как виртуальная машина .NET понимает, что объект пора уничтожать? И когда это происходит?

Подробно про сборщик мусора можно почитать тут:
https://habr.com/ru/post/125968/ (не самая актуальная статья, но в целом ок)
https://habr.com/ru/company/clrium/blog/463293/
https://github.com/dotnet/coreclr/blob/master/Docu...

Вкратце, он отслеживает все ссылки на объекты, и если к объекту уже точно никто не сможет обратиться - уничтожает его.
Точный момент времени уничтожения объекта в общем случае сложно назвать
Что будет если нужно выполнить код выше в цикле? То есть будет создано множество объектов.
По идее они мне в дальнейшем не нужны. Как только я получил return (имя папки), этот объект мне не нужен.
И если всё это в цикле, логично будет сразу уничтожить объект.

В этом случае GC очень быстро их соберёт, тк единственная ссылка на этот объект была в переменной в этом методе.
Самостоятельно ничего делать не надо.
Никакой утечки памяти не будет.

Правда если этот код будет выполняться уж очень часто, и он является горячим местом - имеет смысл отказаться от FileInfo, и парсить пути без засирания кучи.
Ответ написан
Комментировать
@JuniorNoobie
Сижу в поддержке, пишу мелкие проекты
Скажем так, делать это не обязательно (собирать мусор самому), но если очень нужно (например, в рамках быстродействия), то можно и самому прописать уничтожение объектов (в finally, например).
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы