C# 与x27之间的差异;使用';范围界定?
以下两段代码之间的区别是什么:C# 与x27之间的差异;使用';范围界定?,c#,scope,using,C#,Scope,Using,以下两段代码之间的区别是什么: using (Object o = new Object()) { // Do something } 及 我已经开始更多地使用和了,但我很好奇与作用域对象相比,它的实际好处是什么 编辑:我从以下内容中获取了一些有用的花絮: 乔恩·斯凯特: 请注意,这不会以任何方式、形状或形式强制垃圾收集。垃圾收集和即时资源清理在某种程度上是正交的 Eddins是否会评论: 除非您的类实现IDisposable接口并具有Dispose()函数,否则您不会使用 第一个代码
using (Object o = new Object())
{
// Do something
}
及
我已经开始更多地使用和了,但我很好奇与作用域对象相比,它的实际好处是什么
编辑:我从以下内容中获取了一些有用的花絮:
乔恩·斯凯特:
请注意,这不会以任何方式、形状或形式强制垃圾收集。垃圾收集和即时资源清理在某种程度上是正交的
Eddins是否会评论:
除非您的类实现IDisposable接口并具有Dispose()函数,否则您不会使用
第一个代码段在块的末尾调用Dispose
——您只能对实现IDisposable
的类型执行,它基本上在finally块中调用Dispose
,因此您可以对需要清理资源的类型使用它,例如
using (TextReader reader = File.OpenText("test.txt"))
{
// Use reader to read the file
}
// reader will be disposed, so file handle released
请注意,这不会以任何方式、形状或形式强制垃圾收集。垃圾收集和即时资源清理在某种程度上是正交的
基本上,您应该使用using
语句来处理几乎所有实现IDisposable
并且代码块将负责的事情(在清理方面)。在使用
结束时,对象被释放(放在括号内的对象必须实现IDisposable). 该对象在异常情况下也会被释放。您不必等待GC在某个时间执行它(您控制它)
编辑:范围界定的缺点是:
- 您不控制对象的处置
- 即使在作用域的末尾调用dispose,它也不是异常安全的
请参阅有关可确定资源释放的文档
简单地说,在使用{}
块的末尾,您可以可靠地处置分配的资源(例如关闭文件句柄、数据库连接等)。使用
只需要实现IDisposable接口,并在作用域末尾调用dispose方法
关于正确处理对象,有很多激烈的争论,还有很多其他的线索。只是为了说明区别
using (FileStream fileStream = new FileStream("log.txt", FileMode.OpenCreate))
{
//stuff with file stream
}
和…一样
{
FileStream fileStream = new FileStream("log.txt", FileMode.OpenCreate);
try
{
//stuff with filestream
}
finally
{
if (fileStream != null)
((IDisposable)fileStream).Dispose();
}
}
何处为
{
FileStream fileStream = new FileStream("log.txt", FileMode.OpenCreate);
fileStream.Dispose();
}
是这样的。公平地说,这在需要清理类可能持有的非托管资源时最适用吗?或者它也适用于纯托管类吗?+1关于垃圾收集,我总是倾向于忘记它……IDisposable/using与“典型”与“重”对象无关。只要类有需要清除的非托管实例资源,或者当它有一个本身可IDisposable的托管实例字段时,它就应该实现IDisposable。该类可以只有一个字段,但如果该字段可IDisposable,则包含该字段的类也应可IDisposable。除非您的类实现了IDisposable
接口,并且具有Dispose()
函数,否则您不能使用。我想,如果你尝试的话,你应该会得到一个编译器错误。这基本上是一个try-finally块,它将保证对象在超出范围时被释放。@Sam:我将纠正这两个问题:“如果一个类只有一个IDisposable
字段,并且它拥有该字段引用的对象,那么它本身应该是IDisposable
”。所有权是这里的关键。
{
FileStream fileStream = new FileStream("log.txt", FileMode.OpenCreate);
fileStream.Dispose();
}