zai*_*aqi 13 .net c# resources memory-leaks
我是C#和.NET的新手,并且一直在阅读它.
我需要知道为什么以及何时需要释放资源?垃圾收集器不能处理所有事情吗?我什么时候需要实现IDisposable,它与C++中的析构函数有什么不同?
另外,如果我的程序相当小,即屏幕保护程序,我是否需要关心释放资源?
谢谢.
Jon*_*eet 15
垃圾收集器只知道内存.这对内存来说很好,因为只要你已经有足够的内存,一点内存几乎和其他内存一样好.(这是所有模缓存一致性等)
现在将其与文件句柄进行比较.操作系统可以有足够的空间来分配更多的文件句柄 - 但是如果你留下一个特定文件的句柄,那么其他任何人都无法打开该特定文件进行写入.一旦完成,你应该告诉系统你何时完成一个句柄 - 通常是通过关闭相关的流 - 并且即使抛出异常也会以关闭它的方式这样做.这通常使用一个using
语句来完成,该语句类似于Dispose
在finally块中调用的try/finally .
用C++析构函数是非常从.NET终结不同,因为C++的析构函数是确定性的-当相关变量超出范围,例如它们会自动调用.在任何"实时"对象不再引用对象之后的某个时刻,终结器由垃圾收集器运行,但时间是不可预测的.(在极少数情况下,它可能永远不会发生.)
IDisposable
如果你有任何清理应该确定性地进行清理,你应该自己实现- 通常情况下,如果你的一个实例变量也实现了IDisposable
.现在很少需要自己实现终结器 - 如果你直接持有操作系统句柄,通常只需要一个,你通常只需要一个终结器IntPtr
.SafeHandle
使所有这一切变得更加容易,让您不必自己编写终结器.
基本上,您需要担心将资源释放给非托管代码 - .NET 框架之外的任何内容。例如,数据库连接或操作系统上的文件。
垃圾收集器处理托管代码 - .NET 框架中的代码。
即使是小型应用程序也可能需要释放非托管资源,例如它可能会写入本地文本文件。使用完资源后,您需要确保调用对象的 Dispose 方法。using语句简化了语法:
using (TextWriter w = File.CreateText("test.txt"))
{
w.WriteLine("Test Line 1");
}
Run Code Online (Sandbox Code Playgroud)
TextWriter 对象实现 IDisposable 接口,因此只要 using 块完成,就会调用 Dispose 方法并且可以对对象进行垃圾收集。无法保证实际收集时间。
如果您创建自己的需要正确处理的类,您将需要自己实现 IDisposable 接口和 Dispose 模式。在一个简单的应用程序中,您可能不需要这样做,如果您这样做,这是一个很好的资源。
归档时间: |
|
查看次数: |
8179 次 |
最近记录: |