当c#.net使用块失败时会发生什么?

时间:2012-08-06 16:27:54

标签: c# .net block using

如果我有一个使用块,我创建一个对象(例如一个FileStream对象),并且该对象无法创建(返回null,抛出异常等),块中的代码是否仍然执行?< / p>

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

如果FileStream构造函数返回null(如果FileStream构造函数总是返回一个有效的对象,让我们只是为了参数说可以返回null),那么代码内部会执行吗?或者它会跳过“在这里用fs做什么”代码?

4 个答案:

答案 0 :(得分: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构造函数返回null(如果FileStream   构造函数总是返回一个有效的对象,让我们只是为了说   可以返回null的参数,将代码放在里面   执行?

是的,它会。

显然,每个熟悉C#规范的人都知道构造函数(不管是哪种类型)都可以永远不会返回null哪种类型会让你的问题变得不切实际。

答案 1 :(得分:0)

异常将照常处理,即通过封闭的try ... catch,如果你有一个或由系统。

答案 2 :(得分:0)

如果它抛出异常,它肯定不会执行。如果没有抛出异常,它将尝试执行该块。虽然如果它返回null,我的猜测是在从内部抛出异常然后退出之前不会走得太远。

答案 3 :(得分:0)

无论如何都会执行代码,因此您需要保护代码免受攻击。以此控制台应用程序为例,WriteLine将执行。

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