gal*_*13x 18 .net c# resources idisposable
有关托管与非托管资源的问题很多.我理解这两者的基本定义.但是,我很难知道资源或对象何时被管理或不受管理.
当我想到非托管资源时,我倾向于认为本机代码不是.NET的直接组成部分,例如pinvoke或编组资源.我通常认为资源意味着与使用硬件的东西接口,例如文件句柄或网络连接也是不受管理的.
那些包装本机非托管资源的.NET对象呢FileStream?
一个FileStream必须使用非托管资源,但是当我实现IDisposable模式,我认为这是一个管理的或者非托管资源?
到目前为止,我一直在假设如果对象实现IDisposable,那么它就被管理了.我怎么知道IntPtr应该作为非托管resoruce处理?
Hen*_*man 14
一个
FileStream必须使用非托管资源,但是当我实现IDisposable模式,我认为这是一个管理的或者非托管资源?
FileStream是托管资源.
托管资源是包含(并且必须管理)非托管资源的类.通常,实际资源是几层.
到目前为止,我一直在假设如果对象实现
IDisposable,那么它就被管理了.
正确.
我怎么知道IntPtr应该作为非托管resoruce处理?
从您获得其价值的API文档.但请注意,在实践中,大多数程序员从不直接处理非托管资源.当您需要时,使用SafeHandle该类将非托管资源转换为托管资源.
Han*_*ant 10
它非常简单,您永远不会意外地分配非托管资源.你需要一个pinvoke调用来分配它,你知道它.术语"对象"被重载,但是没有非托管对象这样的东西,.NET程序中的所有对象都被管理.您可以使用另一种支持创建对象的语言(如C++)编写代码.但是你不能直接使用这样的对象,需要C++/CLI包装器.这使它成为实现IDisposable的托管类.
如果您使用记录不良的库,那么在获得IntPtr时请注意.这是一个非常强烈的迹象,表明涉及非托管分配,指向非托管内存或操作系统句柄.那么该库也应该为您提供一种释放它的方法,如果它没有自动管理它.如果您不确定如何正确处理它,请联系图书馆的所有者.
微软的工作是围绕所有常见的操作系统资源提供托管包装类.像FileStream,Socket等.这些类几乎总是实现IDisposable.当您在自己的类中存储这样的类对象时,您在代码中唯一要做的就是自己实现IDisposable,这样就可以在这些对象上调用Dispose()方法.或者使用使用,如果你使用它们作为方法的局部变量声明.
| 归档时间: |
|
| 查看次数: |
12130 次 |
| 最近记录: |