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

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

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

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

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

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

Как уничтожаются объекты и надо ли их самому уничтожать?
  • Вопрос задан
  • 113 просмотров
Решения вопроса 1
nozd
@nozd
C# Python Vue
CLRium #5: Garbage Collector. 2019 год
Расширяет понимание работы GC, выделения и использования памяти и т.п. Но без предварительно чтения соответствующего материала, например, у Рихтера, понять будет сложно.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
vabka
@vabka Куратор тега C#
Токсичный шарпист
Как виртуальная машина .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, например).
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
deeplay Новосибирск
от 180 000 до 300 000 ₽
Retail Rocket Москва
от 80 000 до 120 000 ₽
28 сент. 2021, в 02:57
510 руб./в час
28 сент. 2021, в 01:44
35000 руб./за проект