C# 我何时需要一次性元件的“使用”语句?

C# 我何时需要一次性元件的“使用”语句?,c#,dispose,C#,Dispose,我知道在下面的例子中,使用可以释放一次性元素,即 using (StreamReader sr = StreamReader(filename)) { txt = sr.ReadToEnd(); } 但是,如果我内联使用它,是否也会发生同样的情况?如您所见,我没有将其定义为变量: txt = (StreamReader(filename)).ReadToEnd(); 定义或不定义变量并不影响是否需要处理对象 如果创建了一个实现了IDisposable的类实例,则在使用完该类后,

我知道在下面的例子中,
使用
可以释放一次性元素,即

using (StreamReader sr = StreamReader(filename)) 
{
    txt = sr.ReadToEnd();
}
但是,如果我内联使用它,是否也会发生同样的情况?如您所见,我没有将其定义为变量:

 txt = (StreamReader(filename)).ReadToEnd(); 

定义或不定义变量并不影响是否需要处理对象

如果创建了一个实现了
IDisposable
的类实例,则在使用完该类后,应该对其调用
Dispose


您可以使用
using
或手动调用
Dispose
-使用
语句通常更方便、更简单。

首先,Dispose方法允许类的开发人员(在本例中为
System.IO.StreamReader
)释放他们可能持有的任何非托管资源(很多人用它来做一般的清洁)

通常,如果一个类实现了
IDisposable
(因此包含Dispose方法),那么应该明确地调用它

上面使用的
using
语句将编译为以下内容:

//Very roughly your code sample
using (var sr = new StreamReader())
{
    //Some code
}

//What gets spat out by the compiler
var sr = new StreamReader();
try
{
    //Some code
}
finally
{
    sr.Dispose();
}
如您所见,此模式意味着无论
//Some code
部分是否抛出not异常,都将调用Dispose

本质上,它是一个C#helper,因此您不必编写上面的安全代码来确保一次性物品的处置

因为有明显的好处,问题应该是“什么时候不应该使用”.

第二个示例中的情况与第一个示例中的情况不同。在第二个示例中,StreamReader将在该行执行后立即成为符合垃圾收集条件的,因为您没有将其存储在变量中(因此它将超出范围)。这里的关键字是“符合条件”-无法保证对象何时被真正清理。因此,第二行代码将导致文件上的锁被“保留”,直到垃圾收集器开始对StreamReader进行垃圾收集


另一方面,如果您在
StreamReader
上调用
Dispose()
,它将立即释放文件上的锁,而无需等待垃圾收集器。

因为它不会被释放:)很难理解您的要求。如果没有关键字
using
,当作用域结束不一样时,你将永远无法得到调用
Dispose()
的东西,因为在一个例子中,你使用的是
using
关键字,而在另一个例子中,你不是。您的代码示例并不相同。您是否定义了变量并不影响是否需要释放该对象。它仍然被实例化,并且仍然实现IDisposable。@rokkerboci它最终将被清理-第二个示例的主要问题是,您不知道何时清理它。当您要处理的对象未在同一范围内实例化和处理时。。。例如,如果实现
IDisposable
的某个对象被实例化为类的成员变量。。。那你就不能用了。