Обычно, если вы не пересекаете границы нативного и управляемого кодов, вам не нужно беспокоиться об освобождении неуправляемых ресурсов в ваших классах.
Когда вы запускаете приложение .NET, платформа выделяетуправляемый фрагмент памяти для него, где почти все, к чему вы можете получить доступ из .NET Framework, будет храниться и отслеживаться GC.Все остальное выпадает за пределы этого среза, оставаясь без острых глаз GC.
Итак, на ваш вопрос о том, как GC определяет, какие ресурсы следует собирать, а какие нет, краткий ответ заключается в том, что это не так.знать что-либо о неуправляемых ресурсах, поэтому он также не может их собирать.
Эти миры - нативный и управляемый - разделены, но они могут взаимодействовать друг с другом, и это то, что Marshalling за.Вы можете прочитать больше об этом здесь .С этим, конечно, вы можете создавать неуправляемые ресурсы, но это не значит, что вы будете делать это каждый раз, когда вы его используете.
Сказать, что каждый раз, когда вы используете API-интерфейсы Win32, вы будете создавать, это будет несколько экстремально.родные ресурсы, которые вы должны выпустить.Когда вы используете Платформа Invoke или Оболочка C ++ / CLI , вызывает любой собственный код, который создает указатели или что-либо, что должно быть выпущено вручную в собственном мире (те, которые, конечно, не отслеживаютсяGC), вы должны отпустить их вручную, если они не выпущены уже на нативной стороне.Но если вы используете API-интерфейсы, которые просто работают с примитивными типами, вам не нужно ничего выпускать.
Если вы не используете ничего из вышеизложенного, есть большая вероятность, что вам не нужно готовить своиклассы для непосредственного выпуска чего-либо неуправляемого.
Существуют типы, использующие собственные ресурсы - вы, вероятно, уже сталкивались - которые являются управляемыми оболочками.Они высвобождают эти ресурсы в своей реализации Dispose
с помощью marshalling.
Например, управляемый класс FileStream
содержит неуправляемый дескриптор для данного файла.FileStream
сам по себе является управляемым классом, отслеживаемым и собираемым GC, но неуправляемый дескриптор - нет, его необходимо освободить вручную, поэтому, если вы, пользователь FileStream
, не вызываете его метод Dispose
в вашемкод, этот дескриптор будет оставаться в памяти до тех пор, пока приложение не закроется.