.NET中“托pipe”与“非托pipe”资源的含义是什么?

.NET中的托pipe资源和非托pipe资源是什么意思? 他们如何进入画面?

术语“非托pipe资源”通常用于描述不直接由垃圾收集器控制的内容 。 例如,如果您打开到数据库服务器的连接,则将使用服务器上的资源(用于维护连接)以及客户端计算机上可能的其他非.NET资源(如果提供程序未完全写入托pipe代码中)。

这就是为什么像数据库连接那样,build议你这样写代码:

using (var connection = new SqlConnection("connection_string_here")) { // Code to use connection here } 

这样可以确保在连接对象上调用.Dispose() ,确保清理任何非托pipe资源。

pipe理资源是那些纯粹的.NET代码,由运行时pipe理,并受其直接控制。

非托pipe资源是那些不是。 文件句柄,固定内存,COM对象,数据库连接等

托pipe和非托pipe资源之间的基本区别在于,垃圾回收器知道所有托pipe资源,在某个时间点,GC将出现并清理与托pipe对象关联的所有内存和资源。 GC不知道非托pipe资源,比如文件,stream和句柄,所以如果你没有在你的代码中明确地清理它们,那么你将最终得到内存泄漏和locking的资源。

欲了解更多详情 – http://bytes.com/topic/c-sharp/answers/276059-what-unmanaged-resources

在问答中什么是非托pipe资源? 1布鲁斯·伍德贴出以下内容:

我这样想到“pipe理”和“非pipe理”这两个术语:

“托pipe”是指.NET沙箱中的任何内容。 这包括所有.NET Framework类。

“非托pipe”是指.NET沙箱之外的荒野。 这包括通过调用Win32 API函数返回给您的任何内容。

如果你永远不会调用一个Win32 API函数,并且永远不会取回任何Win32“句柄”对象,那么你就没有任何非托pipe资源。 通过.NET Framework类方法打开的文件和stream都是托pipe包装。

评论:您可能没有直接持有非托pipe资源。 但是,您可能通过托pipe的“包装类”(如System.IO.FileStream) 间接持有非托pipe资源。 这样的包装类通常实现IDisposable (直接或通过inheritance)。

…许多托pipe(.NET Framework)对象在其中包含非托pipe资源,您可能希望尽快处理它们,或者至less为您的呼叫者提供这样的机会。 这就是编写你自己的Dispose()方法的地方。实质上,实现IDisposable()为你做了两件事情:

  1. 允许你摆脱.NET背后的操作系统直接抓取的资源(非托pipe资源)。

  2. 允许你和你的调用者释放沉重的.NET对象/ .NET对象,这些对象在您的/你的调用者想要发布的肮脏的小手中持有宝贵的资源。

评论:通过实现IDisposable并从而提供Dispose()方法,您可以让您的类的用户以确定性的方式释放由您的类实例持有的任何非托pipe资源。


1链接最初在Sachin Shanbhag的答案中分享。 引用date为2005年11月17日。 请注意,我轻轻地复制了所引用的内容。

被pipe理的资源是垃圾收集器可以释放的资源,垃圾收集器为了这个目的不能释放非被pipe理的资源。析构器是必需的。