一次性用品,使用和尝试/捕捉块

Are*_*ren 7 .net c# using-statement

今天有一个心理障碍,需要一只手验证我的逻辑并不是很好的.

传统上我会做类似这样的文件i/o:

FileStream fs = null; // So it's visible in the finally block
try
{
   fs = File.Open("Foo.txt", FileMode.Open);

   /// Do Stuff
}
catch(IOException)
{
   /// Handle Stuff
}
finally
{
   if (fs != null)
      fs.Close();
}
Run Code Online (Sandbox Code Playgroud)

但是,这不是很优雅.

理想情况下using,当我完成时,我想使用块来处理文件流,但我不确定using和try/catch之间的协同作用.

这就是我想要实现上述内容的方式:

try
{
   using(FileStream fs = File.Open("Foo.txt", FileMode.Open))
   {
      /// Do Stuff
   }
}
catch(Exception)
{
   /// Handle Stuff
}
Run Code Online (Sandbox Code Playgroud)

但是,我担心使用块中的过早退出(通过抛出异常)可能不允许使用块完成执行并清理它的对象.我只是偏执狂,还是会按照我打算的方式运作?

Jon*_*eet 17

你只是偏执狂,它会像你想要的那样工作:)

using语句相当于try/finally块,无论它是否在try/catch中.

所以你的代码类似于:

try
{
   FileStream fs = null;
   try
   {
       fs = File.Open("Foo.txt", FileMode.Open);
       // Do stuff
   }
   finally
   {
       if (fs != null)
       {
           fs.Dispose();
       }
   }
}
catch(Exception)
{
   /// Handle Stuff
}
Run Code Online (Sandbox Code Playgroud)