私は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
構築され、前に破棄されることです。残念ながら、C#仕様には、実際にどのように行われるべきかについての方向性はないようです。これは上記のプログラムを実行した結果であるため、MicrosoftのC#コンパイラはこれを次のように処理しているように見えます。b
b
a
Creating a
Creating b
Disposing b
Disposing a
ただし、これが決定論的な動作であることを確認する方法はありません。誰かがこのシーケンスが決定論的であるという考えを確認または反論することができますか?参照は素晴らしいでしょう。そして明らかに、それが破損しやすい場合(文書化されていないなど)、それはおそらく有用ではありませんが、それは知っておくとよいことです。
複数の活字ケースについて話している決定論的処分については、すでに同様の質問があります。巧妙な構文のトリック以外に実際の解決策はないことを理解しています。とにかく、そこにある答えのほとんどは要点を見逃しています。私の質問は、単一活字ケースと、この処分が決定論的で信頼できるかどうかについてです。ありがとう。