7

我真的很烦恼必须using在 C# 中嵌套块。它不优雅,占用大量空间。在某些情况下,这似乎是不可避免的,因为我需要声明不同数据类型的变量,但似乎应该可以简化单一类型的情况。我所说的“单一类型案例”是指串联声明多个相同类型的变量。这是我正在谈论的一个例子:

class Program
{
    static void Main(string[] args)
    {
        using (A a = new A("a"), b = new A("b"))
        {
        }
    }

    class A : IDisposable
    {
        string n = null;
        public A(string name)
        {
            n = name;
            Console.WriteLine(String.Format("Creating {0}", n));
        }

        public void Dispose()
        {
            Console.WriteLine(String.Format("Disposing {0}", n));
        }
    }
}

我希望它工作的方式a是在之前构建b,并且b在之前处置a。不幸的是,C# 规范中似乎没有关于它应该如何实际发生的任何方向。似乎微软的 C# 编译器是这样对待它的,因为这是运行上述程序的输出:

Creating a
Creating b
Disposing b
Disposing a

但是,我无法确保这是确定性行为。有人可以确认或反驳这个序列是确定性的想法吗?参考文献会很棒。显然,如果它容易损坏(无证等),它可能没有用,但这是一件好事。

已经有一个关于确定性处理的类似问题,它讨论了多类型的情况,我知道除了聪明的语法技巧之外没有真正的解决方案。无论如何,那里的大多数答案都没有抓住重点。我的问题只是关于单一类型的案例,以及这种处置是否是确定性和可靠的。谢谢。

4

2 回答 2

18

C# 规范:

using形式的语句using (ResourceType r1 = e1, r2 = e2, ..., rN = eN)完全等同于嵌套using语句的序列:”

using (ResourceType r1 = e1)
   using (ResourceType r2 = e2)
      ...
         using (ResourceType rN = eN)
            statement

因此,可以说这是一成不变的。

于 2010-08-10T13:47:14.097 回答
9

有什么理由不能使用多次使用技巧吗?这完全是确定性的,可以解决您的问题

using (A a = new A("a"))
using (A b = new A("b")) {
    // ....
}
于 2010-08-10T13:46:44.020 回答