IDisposable比使用块更简单的语法?

时间:2013-06-25 10:27:32

标签: c# .net idisposable

我写了这段代码

var doc = new StreamReader(stream).ReadToEnd();

但后来我记得应该使用C#的using block来确保尽快调用StreamReader的清理方法Dispose。这给了我这段代码

string doc;
using (var reader = new StreamReader(stream))
{
    doc = reader.ReadToEnd();
}

这是更长,更难阅读。是否有一个更简单的单行语法仍然正确地使用IDisposable东西?

3 个答案:

答案 0 :(得分:2)

在块中只有一行,你可以简单地写

using (var reader = new StreamReader(stream))
    doc = reader.ReadToEnd();

然而,没有办法进一步简化这一点。对于这样的事情,using只是一些语法糖:

var reader = new StreamReader(stream);

try
{
    doc = reader.ReadToEnd();
}
finally
{
    reader.Dispose();
}

这甚至不会阻止您在处置后访问该对象。所以using实际上是完成工作的简短方法。

关于合并using - 语句的一个注释:如果您正在使用FileStreamStreamReader / StreamWriter,则可以简单地合并多个using - 语句一个人:

using (var stream = new FileStream(@"C:\Test.txt", FileMode.Open, FileAccess.Read))
using (var reader = new StreamReader(stream))
{
    doc = reader.ReadToEnd();
}

答案 1 :(得分:0)

您可以像这样手动调用dispose方法:

var reader= new StreamReader(stream);

try
{
    var doc = reader.ReadToEnd();
}
finally
{
    reader.Dispose();
}

这实际上等同于使用语法。但是使用它仍然是编写它的最短路径。

答案 2 :(得分:0)

没有。 3个操作通常需要3行...特别是如果每​​个操作返回一些内容。

您有几个选择:

  1. 全部在一条线上。
  2. 明确调用Dispose()
  3. using ..就像它的意图:)
  4. 如果你担心额外的线路......你会担心错误的事情。