c# - 在 C# 中对同一作用域使用多个 using 语句时,Dispose() 方法的调用顺序是否有保证?

标签 c# using unmanagedresources destruction

using (Stuff1 stf1 = new Stuff1(...)) // Allocation of stf1
using (Stuff2 stf2 = new Stuff2(...)) // Allocation of stf2
{
    try
    {
        // ... do stuff with stf1 and stf2 here ...
    }
    catch (Stuff1Exception ex1)
    {
        // ...
    }
    catch (Stuff2Exception ex2)
    {
        // ...
    }
} // Automatic deterministic destruction through Dispose() for stf1/stf2 - but in which order?

换句话说,stf2的Dispose()方法是否保证先被调用,stf1的Dispose()方法保证后被调用? (基本上:Dispose() 方法的调用顺序与其所属对象的分配顺序相反?)

最佳答案

using 语句与其他 block 级语句没有什么不同。如果你写了这样的代码:

if (...)
    if (...)
    {

    }

你会很清楚事情发生的顺序(不是我会推荐那个特定的结构),因为它和这个完全一样:

if (...)
{
    if(...)
    {

    }
}

using 也是如此。您的代码与以下代码没有什么不同:

using (...)
{
    using(...)
    {

    }
}

这里,很明显,内部 using block 首先终止,因此它的资源应该首先被释放。

关于c# - 在 C# 中对同一作用域使用多个 using 语句时,Dispose() 方法的调用顺序是否有保证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7924761/

相关文章:

C# TCP 聊天应用线程

c# - "using <namespace>;"指令能否在 .NET 中变得更高效?

c++ - 为什么我不能为构造函数使用别名类型? C++

c# - 需要在使用 TcpClient 的类上实现终结器?

c# - 如何判断资源是否不受管理?

ios - 您清理项目中图像资源的方法是什么

c# - 来自特定类的变量如果其中一方发生变化,双方仍然会一起变化

javascript - 将自动播放添加到现有图像 slider

c# - 如何将创建的数据库项目created dacpac包含到cs项目中

c# - Java 等效于 C# 'using' 语句