Пример очистки управляемого и неуправляемого ресурса

Читаю про паттерн Dispose и во всех примерах это выглядит так //Очищаем управляемый ресурс //очищаем неуправляемый ресурс из за этого складывается недопонимание, если к примеру FileStream fS = new FileStream(path); считается управляемым ресурсом то в блоке, где очищаем управляемый ресурс мы должны написать fS.Close(); то какой пример можно привести для блока, который очищает неуправляемый ресурс?


Ответы (1 шт):

Автор решения: HedgehogNSK

Неуправляемый ресурс - это такой ресурс, который не контролируется CLR. То есть занимаемая им память не будет освобождена по средствам сборщика мусора. IDisposable - это интерфейс неуправляемых ресурсов, который реализует единственный метод Dispose(), который и отвечает за освобождение памяти. Однако за то, где этот метод будет вызван отвечает разработчик. Очевидно, что если его не вызвать, то объект будет висеть в памяти как минимум до конца работы вашей программы, а в некоторых случаях и после.

FileStream - тоже является неуправляемым ресурсом. Это нам подсказывает сигнатура родительского класса public abstract class Stream : MarshalByRefObject, IAsyncDisposable, IDisposable

Когда вы вызываете .Close вы освобождаете память, потому что метод Close в том числе вызывает Dispose внутри себя.

Если неуправляемый ресурс нужен только в рамках выполнения метода, то может быть удобнее использовать using конструкцию, вместо того чтобы вызывать ручками .Dispose или .Close (для FileStream).

Проблемы начинаются, когда вам нужно использовать IDisposable объекты агрегированы в другие объекты. И когда вы уничтожаете объект, который содержит в себе IDisposable объект, вам нужно позаботиться об освобождении ресурсов лично. Для этого мелкомягкие предлагают использовать соответствующий паттерн: https://learn.microsoft.com/ru-ru/dotnet/standard/garbage-collection/implementing-dispose

→ Ссылка