当C# .NET中的using块失败时会发生什么?

3

如果我使用一个using块,在其中创建一个对象(例如一个FileStream对象),但该对象无法创建(返回null,抛出异常等),那么块中的代码仍然执行吗?

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进行处理”的代码?

你觉得它会执行而不是崩溃的原因是什么? - perilbrain
一个返回null的构造函数?? - ken2k
@ken2k:我认为这只是一个例子。假设它不是通过构造函数,而是通过服务定位器、工厂或其他方式请求对象。实际上,编写using(null){}可以编译和运行良好... - Ortiga
4个回答

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(假设它是可能返回null的,尽管无论如何FileStream构造函数总是返回有效对象),那么代码内部会执行吗?

会执行。

显然,了解C#规范的每个人都知道构造函数(无论哪种类型)永远不会返回null,这使得你的问题有点不现实。


0

不管怎样,代码都会执行,所以你需要保护你的代码免受其影响。例如,考虑这个控制台应用程序,WriteLine 将被执行。

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

0

如果您有一个try...catch块,异常将像往常一样被处理,或者由系统处理。


0

如果它抛出异常,那么它肯定不会执行。如果没有抛出异常,它将尝试执行该块。但是,如果它返回null,我猜在内部抛出异常并退出之前,它不会走得太远。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接