6

阅读Dispose 模式,我看到文档反复提到“清理托管和非托管代码”。在该方法的规范实现中,我看到了专门用于清理托管对象与非托管对象的Dispose特定流程(取决于是真还是假)。disposing

但是我,这个卑微的新手,知道哪些类型是托管的,哪些是非托管的吗?

4

5 回答 5

5

非托管是指本机Win32对象,主要是句柄;以及对原始 COM 对象的引用。这些是不受 .NET CLR 控制(或管理)的资源。

于 2009-07-10T21:15:55.230 回答
3

简短的版本是:任何也实现的东西都IDisposable需要在你的Dispose方法中调用。FxCop还会告诉您是否遗漏了某些东西(或者IDisposable在您应该遗漏的时候根本不使用)。

于 2009-07-10T21:12:47.717 回答
2

托管或非托管并不重要。如果一个类实现了 IDisposable 接口,您应该在完成该对象后调用 Dispose()。或者(最好)使用using 语句在对象超出范围时自动调用 Dispose()。

//@Rob:
答案还是一样的。如果您的类管理任何实现 IDisposable 的内部对象,那么它也应该实现 IDisposable。在您的 Dispose() 方法中,对这些对象调用 Dispose。

于 2009-07-10T21:13:49.790 回答
0

如果您不知道,您使用的类型可能是托管的。

非托管类型是指不安全的类型,即不符合 CLR 安全要求。

伟大的定义链接

更新

我不明白反对票?问题具体是如何区分托管类型和非托管类型?

所有其他答案都是针对 IDispose 问题,而不是托管/非托管问题!?

更新 2

仍然没有解释第二次否决...

我同意,IDisposable应该始终处置一个对象,但这并不能回答有关托管与非托管的问题。

于 2009-07-10T21:12:07.797 回答
0

我只是建议在您使用它们后销毁所有资源。任何通常依赖于系统资源的东西,比如你想要显式释放的套接字和流资源。如有疑问,请继续处理。从长远来看,可以为您节省大量调试麻烦。通常,当您调用不是用 .NET 编写的代码时,您可以假定它不是“托管代码”。

于 2009-07-10T21:12:27.890 回答