7

私はusingC#でブロックをネストする必要があることに本当に悩まされています。エレガントではなく、多くのスペースを占有します。異なるデータ型の変数を宣言する必要があるため、やむを得ない場合もありますが、単一型の場合は単純化できるはずです。「単一型の場合」とは、同じ型の複数の変数が直列に宣言されている場合です。これが私が話していることの例です:

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構築され、前に破棄されることです。残念ながら、C#仕様には、実際にどのように行われるべきかについての方向性はないようです。これは上記のプログラムを実行した結果であるため、MicrosoftのC#コンパイラはこれを次のように処理しているように見えます。bba

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 に答える