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

Dan*_*yon 3 .net c# using block

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

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

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

Dar*_*rov 13

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

相当于:

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
Run Code Online (Sandbox Code Playgroud)

所以回答你的问题:

如果FileStream构造函数返回null(如果FileStream构造函数总是返回一个有效的对象,让我们只是为了参数说可以返回null),那么代码内部会执行吗?

是的,它会的.

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