2012-08-06 60 views
3

如果我有一个使用块,我创建一个对象(例如FileStream对象),并且该对象无法创建(返回null,抛出异常等),块中的代码是否仍然执行?当c#.net using block失败时会发生什么?

using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { 
    // do stuff with fs here 
} 
// do more stuff after 

如果FileStream构造函数是返回空值(如果FileStream构造函数总是返回一个有效的对象,让我们只说为便于讨论,有可能返回NULL),将里面的代码执行?或者它会跳过“用fs做这些东西”的代码吗?

+0

是什么让你觉得它仍然会执行而不是崩溃? – perilbrain 2012-08-06 16:30:26

+0

返回null的构造函数? – ken2k 2012-08-06 16:30:31

+0

@ ken2k:正如我所看到的,这仅仅是一个例子。说,而不是一个构造函数,它要求对象服务定位器,工厂或任何东西。实际上,编写'using(null){}'[编译并运行良好](http://blogs.msdn.com/b/ericlippert/archive/2011/03/03/danger-will-robinson.aspx)。 .. – Andre 2012-08-06 16:47:05

回答

13
using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) 
{ 
    // do stuff with fs here 
} 
// do more stuff after 

等同于:

FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite) 
try 
{ 
    // do stuff with fs here 
} 
finally 
{ 
    if (fs != null) 
    { 
     ((IDisposable)fs).Dispose(); 
    } 
} 
// do more stuff after 

因此,要回答你的问题:

如果FileStream构造函数是返回空值(如果FileStream 构造函数总是返回一个有效的对象,让我们只是说为了 的说法,有可能返回null), 里面的代码会执行吗?

是的,它会的。

显然大家熟悉C#规格都知道,一个构造函数(无论哪种类型)可以从未回报null哪一种让你的问题有点不现实。

0

异常将像平常一样得到处理,即如果您有一个或系统,则通过封闭try ... catch来处理异常。

0

如果它引发异常,它肯定不会执行。如果没有抛出异常,它将尝试执行该块。虽然如果它返回null,我的猜测是,在从内部抛出一个异常并退出之前,它不会有太大的帮助。

0

无论如何,代码都会执行,因此您需要保护您的代码免受它影响。举例来说,这个控制台应用程序将执行WriteLine

class Program 
{ 
    static void Main(string[] args) 
    { 
     using (null) 
     { 
      Console.WriteLine("Hello."); 
     } 
    } 
} 
相关问题