阅读Dispose 模式,我看到文档反复提到“清理托管和非托管代码”。在该方法的规范实现中,我看到了专门用于清理托管对象与非托管对象的Dispose
特定流程(取决于是真还是假)。disposing
但是我,这个卑微的新手,知道哪些类型是托管的,哪些是非托管的吗?
阅读Dispose 模式,我看到文档反复提到“清理托管和非托管代码”。在该方法的规范实现中,我看到了专门用于清理托管对象与非托管对象的Dispose
特定流程(取决于是真还是假)。disposing
但是我,这个卑微的新手,知道哪些类型是托管的,哪些是非托管的吗?
非托管是指本机Win32对象,主要是句柄;以及对原始 COM 对象的引用。这些是不受 .NET CLR 控制(或管理)的资源。
简短的版本是:任何也实现的东西都IDisposable
需要在你的Dispose
方法中调用。FxCop还会告诉您是否遗漏了某些东西(或者IDisposable
在您应该遗漏的时候根本不使用)。
托管或非托管并不重要。如果一个类实现了 IDisposable 接口,您应该在完成该对象后调用 Dispose()。或者(最好)使用using 语句在对象超出范围时自动调用 Dispose()。
//@Rob:
答案还是一样的。如果您的类管理任何实现 IDisposable 的内部对象,那么它也应该实现 IDisposable。在您的 Dispose() 方法中,对这些对象调用 Dispose。
如果您不知道,您使用的类型可能是托管的。
非托管类型是指不安全的类型,即不符合 CLR 安全要求。
更新
我不明白反对票?问题具体是如何区分托管类型和非托管类型?
所有其他答案都是针对 IDispose 问题,而不是托管/非托管问题!?
更新 2
仍然没有解释第二次否决...
我同意,IDisposable
应该始终处置一个对象,但这并不能回答有关托管与非托管的问题。
我只是建议在您使用它们后销毁所有资源。任何通常依赖于系统资源的东西,比如你想要显式释放的套接字和流资源。如有疑问,请继续处理。从长远来看,可以为您节省大量调试麻烦。通常,当您调用不是用 .NET 编写的代码时,您可以假定它不是“托管代码”。