私は C# を学んでいて、using シンタックを使用してそれを呼び出す唯一のメソッド Dispose() を持つ IDisposable と呼ばれるインターフェイスについて読みました。以下を使用する場合:
Class b=new Class();
using(b)
{
//statements
}
using (Class o=new Class())
{
//statements
}
オブジェクト b と o をどちらも中かっこの後に使用しようとするとどうなりますか?
私は C# を学んでいて、using シンタックを使用してそれを呼び出す唯一のメソッド Dispose() を持つ IDisposable と呼ばれるインターフェイスについて読みました。以下を使用する場合:
Class b=new Class();
using(b)
{
//statements
}
using (Class o=new Class())
{
//statements
}
オブジェクト b と o をどちらも中かっこの後に使用しようとするとどうなりますか?
b
は引き続きスコープ内にあり、null ではありませんが、適切に実装された dispose クラスのほとんどは、呼び出し後に使用しようとすると例外をスローする必要Dispose
があります(したがって、それ以上使用できなくなります)。
これはコンパイルされ、まだ使用できる可能性があります。これは、内部でどのように実装されているかに完全に依存します。ただし、状態が保証されておらず、紛らわしいコードが作成されるため、使用しないでください。
o
範囲外になり、コンパイルされません。
ステートメントが行うusing
ことは、コンパイラーにいくつかのステートメントを発行させ、ラップされたオブジェクトtry-catch
を呼び出すことだけです。Dispose
他には何もしません。
後でオブジェクトが必要になった場合、using ブロックを使用する必要はありません。これを使用することをお勧めしますが、場合によっては次の構造を使用できます。
class b = null;
try
{
b = new class();
/* ... do your stuff ... */
}
catch (Exception)
{
/* handle errors */
throw;
}
finally
{
if (b != null)
{
b.Dispose();
b = null;
}
}
このように、 b が存在する場合、メソッドの最後に破棄されます。
using ブロック内に using ブロックを含めることもできます。
using (Class a=new Class())
{
/* you can access a here */
using (Class b=new Class())
{
/* you can access a and b here */
}
}