Я бы сказал, что обычно все, что создается с использованием .Net Framework, является управляемым ресурсом. Внутренне они могут использовать неуправляемые ресурсы, но, с вашей точки зрения, ими управляют. Одним из исключений к этому является когда вы P / Invoke. Хотя вы создаете функцию, которая работает с .Net, вызов передается за пределы «песочницы» .Net и поэтому считается неуправляемым.
Ответ на @ supercat
События из долгоживущих объектов могут полностью обрабатываться в рамках .net, но их определенно необходимо рассматривать как неуправляемые ресурсы для предотвращения утечек памяти
Я думаю, что здесь есть две разные вещи. Там обсуждается управляемый против неуправляемого и есть обсуждение управления памятью для приложения. Возможно, вам следует обращаться с некоторыми объектами так, как будто они неуправляемые, но это не значит, что они неуправляемые. Например, класс Brush
, который я бы посчитал управляемым, но вы должны рассматривать его как неуправляемый, вызывая Dispose()
. В классе скрыты / абстрагированы неуправляемые объекты, о которых, как вы надеетесь, Dispose()
позаботится. Но Dispose()
на самом деле не освобождает ресурсы, это всего лишь шаблон, который, как вы надеетесь, разработчики реализуют правильно.
Чтобы пойти дальше, я бы сказал, что большинство неуправляемых объектов создаются путем вызова CreateXYZ()
метода Win32, который возвращает указатель, но должен быть освобожден с использованием метода `DestroyXYZ () / DeleteXYZ () ', который принимает тот же указатель. С другой стороны, управляемые объекты реализуют Dispose / Finalize, чтобы сделать это для вас. Еще раз, вы надеетесь, что авторы управляемых ресурсов сделали это, но нет никакой гарантии.