使用关键字和托管\ UnManaged代码
C#关键字使用实现Idisposable它提供了释放非托管资源的机制。
现在我正在浏览这个代码
string txt = String.Empty;
using (StreamReader sr = new StreamReader(filename)) {
txt = sr.ReadToEnd();
}
并不能停止想知道,为什么在这段代码中使用关键字Using ,而StreamReader是一个托管资源,它的作用域是垃圾收集器在其作用域结束后释放对象内存的责任。
所以我的问题是,
为什么在此代码中使用关键字Using,而StreamReader是托管资源
虽然StreamReader是一个托管对象,但它可能会在托管堆中存放未分配的对象。 垃圾收集器无法识别其分配,因此无法清理它们。 对于StreamReader
的特殊情况,它在内部创建一个FileStream
(针对您的特定情况),它在内部创建并保存WIN32文件句柄。
_handle = Win32Native.SafeCreateFile(tempPath, fAccess, share, secAttrs, mode, flagsAndAttributes, IntPtr.Zero);
(代码参考)
using
只是简写:
try
{
var streamReader = new StreamReader(path);
// code
}
finally
{
streamReader.Dispose();
}
实现IDisposable
方法需要实现Dispose
,以便他们有机会关闭文件句柄,套接字或任何可能需要手动清理的资源。
如果有人在类中持有StreamReader
那么该类也应实现IDisposable
,以便将Dispose
正确传递给StreamReader
。
因此,可以将IDisposable
视为一个类的合约, IDisposable
可以保存本机对象,也可以保存实现IDisposable的对象
我认为这更像是一种防御性编码风格,我不希望使用流读取器对象,因为与此对象关联的文件已使用ReadtoEnd函数完全读取,并且正在被txt引用。
链接地址: http://www.djcxy.com/p/54509.html上一篇: Using keyword and Managed\UnManaged code
下一篇: Should classed that use huge amounts of memory impmlement System.IDisposable