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 做事”代码?

4

4 回答 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 (如果 FileStream 构造函数总是返回一个有效的对象,我们只是为了参数的缘故,可以返回 null),里面的代码会执行吗?

是的,它会。

显然,熟悉 C# 规范的每个人都知道,构造函数(无论是哪种类型)永远无法返回null哪种类型,这让您的问题有点不切实际。

于 2012-08-06T16:30:43.233 回答
0

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

于 2012-08-06T16:31:03.370 回答
0

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

于 2012-08-06T16:31:49.073 回答
0

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

class Program
{
    static void Main(string[] args)
    {
        using (null)
        {
            Console.WriteLine("Hello.");
        }
    }
}
于 2012-08-06T16:31:50.147 回答