清空“使用”块

时间:2014-07-25 14:30:23

标签: c# using

已经确定here空的使用块不是覆盖Dispose()的合适方式,但以下情况又如何呢?

这是否适用于空using块?

try
{
    using (File.OpenRead(sourceFile)) { }
}
catch (FileNotFoundException)
{
    error = "File not found: " + sourceFile;
}
catch (UnauthorizedAccessException)
{
    error = "Not authorized to access file: " + sourceFile;
}
catch (Exception e)
{
    error = "Error while attempting to read file: " + sourceFile + ".\n\n" + e.Message;
}

if (error != null)
    return error;

System.Diagnostics.Process.Start(sourceFile);

2 个答案:

答案 0 :(得分:3)

不,它不适用于空的使用块。

你可以简单地写下这样的尝试:

try
{
    File.OpenRead(sourceFile).Close();
}

OpenRead()任何一个都会成功并返回一个你必须关闭的流(或者处理掉,但我认为.Close(更好地表达你的意图),或者它会抛出异常而不返回任何内容。

因此,您始终可以关闭返回的值。

(我假设您在执行其他操作之前只是检查读访问权限。但是,请注意,理论上您可能会遇到竞争条件,因为文件的可访问性可能会在您进行此检查之后以及之后实际打开时发生变化文件。这在实践中不太可能发生,但你应该意识到这种可能性。)

答案 1 :(得分:-1)

使用空的using块没有太大意义,因为您最终可以在catch个链的末尾添加并在那里处理Dispose

FileStream fs;
try {

    fs = File.OpenRead(sourceFile); 
}
catch(..) {
}
catch(..) {
}
catch(..) {
}
finally {

  if(fs !=null) {
      fs.Close();
      fs.Dispose();

  }
}