Метод удаления классов c #, общее примечание «не освобождается до сборщика мусора»

#c# #memory-leaks #garbage-collection #dispose #idisposable

#c# #утечки памяти #сбор мусора #утилизировать #idisposable

Вопрос:

В некоторых одноразовых классах для c # есть примечание к документации:

Всегда вызывайте Dispose перед выпуском последней ссылки на XXXX. В противном случае ресурсы, которые он использует, не будут освобождены до тех пор, пока сборщик мусора не вызовет метод завершения объекта XXXX.

Где XXXX — это, например, значение SemaphoreSlim или ManualResetEventSlim. Из этой заметки я понимаю, что если вы не вызовете dispose (в противном случае), ресурсы, используемые XXXX (включая неуправляемые объекты), в конечном итоге будут освобождены GC.

Правильно ли я понимаю?Потому что, если это так, это означает, что, по крайней мере, для этих классов, нет реальной необходимости вызывать для них Dispose() .

Комментарии:

1. Рассмотрим FileStream объект, у которого есть Dispose() метод. Если вы не удалите FileStream объект, он останется открытым и, вероятно, не будет очищен до тех пор, пока не будет собран мусор. Это означает, что любой другой код, который пытается открыть файл в это время, скорее всего, завершится неудачей. Это очень плохо. Таким образом, вы всегда должны утилизировать одноразовые объекты как можно скорее, если в документации явно не указано, что вам это не нужно для этого типа. Кроме того, если вы не утилизируете одноразовый, GC несет все накладные расходы на управление вызовом его финализатора.

2. Верно, но если я случайно узнаю, что больше не буду использовать FileStream, будет ли это утечкой памяти или GC в конечном итоге утилизирует все свои ресурсы, включая неуправляемые объекты?

3. Это не приведет к утечке памяти, но я бы счел это ошибкой (для примера FileStream).