「using」ブロック内での再初期化は、常に避けるべき悪い考えです。それでも私はこれを尋ねるつもりです:
「using」呼び出しが、最後の参照または再初期化ではなく、元の値で破棄されるのはなぜですか (try finally ブロックが使用されている場合に発生します)。
MyClass b = new MyClass();// implements Idisposable
MyClass c = new MyClass();
MyClass a ;
using (a = new MyClass())
{
a = b;
a = c;
}
上記のコードでは、dispose は元の参照で呼び出され、新しい参照では呼び出されません。これは、dispose メソッドでコンソールに何かを出力することで簡単に確認できます。
ただし、try{} finally コードでは、最後の参照破棄メソッドが呼び出されます。
try
{
a = new MyClass();
a = b;
a = c;
}
finally
{
a.Dispose();
}
MSDN : using ステートメントにより、オブジェクトのメソッドを呼び出しているときに例外が発生した場合でも Dispose が呼び出されることが保証されます。
using (Font font1 = new Font("Arial", 10.0f))
{
byte charset = font1.GdiCharSet;
}
基本的に「使用する」は次のように変換されます。
{
Font font1 = new Font("Arial", 10.0f);
try
{
byte charset = font1.GdiCharSet;
}
finally
{
if (font1 != null)
((IDisposable)font1).Dispose();
}
}