4

私は C# を学んでいて、using シンタックを使用してそれを呼び出す唯一のメソッド Dispose() を持つ IDisposable と呼ばれるインターフェイスについて読みました。以下を使用する場合:

Class b=new Class();
using(b)
{
//statements
}

using (Class o=new Class())
{
//statements
}

オブジェクト b と o をどちらも中かっこの後に使用しようとするとどうなりますか?

4

2 に答える 2

5

bは引き続きスコープ内にあり、null ではありませんが、適切に実装された dispose クラスのほとんどは、呼び出し後に使用しようとすると例外をスローする必要Disposeがあります(したがって、それ以上使用できなくなります)。

これはコンパイルされ、まだ使用できる可能性があります。これは、内部でどのように実装されているかに完全に依存します。ただし、状態が保証されておらず、紛らわしいコードが作成されるため、使用しないでください。

o範囲外になり、コンパイルされません。

ステートメントが行うusingことは、コンパイラーにいくつかのステートメントを発行させ、ラップされたオブジェクトtry-catchを呼び出すことだけです。Dispose他には何もしません。

于 2013-07-03T13:21:53.027 に答える
0

後でオブジェクトが必要になった場合、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  */
  }
}
于 2013-07-03T13:37:28.307 に答える