Управляемый против неуправляемого ресурса с точки зрения создания класса - PullRequest
0 голосов
/ 24 октября 2018

Я пытаюсь понять, когда я создаю свои собственные классы, как я узнаю, что такое управляемый ресурс по сравнению с неуправляемым ресурсом, чтобы я знал, должен ли мой класс обеспечить его очистку или GC в конечном итоге сделает это?Это.Кроме того, немного глубже, когда я создаю метод .Dispose (), будет блок для управляемых ресурсов и блок для неуправляемых ресурсов и как узнать, какие ресурсы должны быть очищены в каком блоке.

Я прочитал много ответов об управляемых и неуправляемых ресурсах в программе на C #, но большинство из них предоставляют определение в отношении очистки GC, как в «Управляемые ресурсы очищаются с помощью GC, а неуправляемые ресурсы - нет».Это не помогает мне, потому что я не вижу, как GC определяет, что он будет очищать и что он оставит позади.Я также понимаю, что если класс предоставляет метод .Dispose (), который должна выполнять моя программа.

Я видел ответы, в которых говорилось, что, если я использую WIN32 API, я создал неуправляемый ресурс.Если я не вызываю WIN32 API, значит ли это, что у меня нет неуправляемых ресурсов?Я также наткнулся на Маршалла.Маршалл также создает неуправляемые ресурсы?Существуют ли другие «ключевые слова / классы», которые можно использовать для определения того, что я создаю неуправляемые ресурсы?

Пожалуйста, исключите из ваших ответов что-нибудь о «управляемых ресурсах, которые занимают огромные объемы памяти».Я понимаю, что было бы неплохо дать возможность освободить эту память, но это не является обязательным требованием, поскольку GC в конечном итоге сделает это, но не всегда своевременно.

1 Ответ

0 голосов
/ 25 октября 2018

Обычно, если вы не пересекаете границы нативного и управляемого кодов, вам не нужно беспокоиться об освобождении неуправляемых ресурсов в ваших классах.

Когда вы запускаете приложение .NET, платформа выделяетуправляемый фрагмент памяти для него, где почти все, к чему вы можете получить доступ из .NET Framework, будет храниться и отслеживаться GC.Все остальное выпадает за пределы этого среза, оставаясь без острых глаз GC.

Итак, на ваш вопрос о том, как GC определяет, какие ресурсы следует собирать, а какие нет, краткий ответ заключается в том, что это не так.знать что-либо о неуправляемых ресурсах, поэтому он также не может их собирать.

Эти миры - нативный и управляемый - разделены, но они могут взаимодействовать друг с другом, и это то, что Marshalling за.Вы можете прочитать больше об этом здесь .С этим, конечно, вы можете создавать неуправляемые ресурсы, но это не значит, что вы будете делать это каждый раз, когда вы его используете.

Сказать, что каждый раз, когда вы используете API-интерфейсы Win32, вы будете создавать, это будет несколько экстремально.родные ресурсы, которые вы должны выпустить.Когда вы используете Платформа Invoke или Оболочка C ++ / CLI , вызывает любой собственный код, который создает указатели или что-либо, что должно быть выпущено вручную в собственном мире (те, которые, конечно, не отслеживаютсяGC), вы должны отпустить их вручную, если они не выпущены уже на нативной стороне.Но если вы используете API-интерфейсы, которые просто работают с примитивными типами, вам не нужно ничего выпускать.

Если вы не используете ничего из вышеизложенного, есть большая вероятность, что вам не нужно готовить своиклассы для непосредственного выпуска чего-либо неуправляемого.

Существуют типы, использующие собственные ресурсы - вы, вероятно, уже сталкивались - которые являются управляемыми оболочками.Они высвобождают эти ресурсы в своей реализации Dispose с помощью marshalling.

Например, управляемый класс FileStream содержит неуправляемый дескриптор для данного файла.FileStream сам по себе является управляемым классом, отслеживаемым и собираемым GC, но неуправляемый дескриптор - нет, его необходимо освободить вручную, поэтому, если вы, пользователь FileStream, не вызываете его метод Dispose в вашемкод, этот дескриптор будет оставаться в памяти до тех пор, пока приложение не закроется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...