0

次の構文のコードスニペットがたくさん表示されます

using (RandomType variable = new RandomType(1,2,3))
{
   // A bunch of code here.

}

変数を宣言して使用しないのはなぜですか?

このUsing構文は、コードを乱雑にし、読みにくくするようです。そして、その変数がそのスコープでのみ利用可能であることが非常に重要である場合、なぜそのブロックを関数に配置しないのですか?

4

6 に答える 6

11

使用する目的は非常に明確です。

IDisposableを実装する型で使用するように設計されています。

あなたの場合、RandomTypeがIDisposableを実装している場合、ブロックの最後で.Dispose()が取得されます。

于 2009-03-17T14:01:45.347 に答える
9
using (RandomType variable = new RandomType(1,2,3))
{
   // A bunch of code here.
}

とほとんど同じです(いくつかの微妙な違いがあります):

RandomType variable = new RandomType(1,2,3);

try
{
    // A bunch of code
}
finally
{
    if(variable != null)
        variable.Dispose()
}

「使用中」を呼び出すときは、IDisposableとして何でもキャストできることに注意してください。

using(RandomType as IDisposable)

finallyのnullチェックは、実際にはIDisposableを実装していないものをすべてキャッチします。

于 2009-03-17T14:01:26.033 に答える
4

いいえ、コードが乱雑になったり、読みにくくなったりすることはありません。

usingステートメントは、IDisposableタイプ(つまり、IDisposableを実装するタイプ)でのみ使用できます。

using --ブロックでそのタイプを使用することにより、using-blockのスコープが終了したときに、そのタイプのDisposeメソッドが使用されます。

だから、どのコードがあなたにとって読みにくいか教えてください:

using( SomeType t = new SomeType() )
{
   // do some stuff
}

また

SomeType t = new SomeType();

try
{
   // do some stuff
}
finally
{
   if( t != null ) 
   {
      t.Dispose();
   }
}
于 2009-03-17T14:02:34.517 に答える
1

usingステートメントで使用されているオブジェクトはIDisposableを実装する必要があるため、スコープの最後でDispose()が呼び出されることが保証されているため、理論的には、その時点でオブジェクトを解放する必要があります。場合によっては、コードがより明確になることがわかりました。

于 2009-03-17T14:02:15.593 に答える
1

usingキーワードは、オブジェクトが割り当てる管理対象または非管理対象のリソースをクリーンアップするための決定論的な方法を提供します。usingキーワードを使用しない場合は、そのオブジェクトの処理が終了したら、Dispose()(または場合によってはClose())を呼び出す必要があります。そうしないと、次のガベージコレクションまでリソースがクリーンアップされないか、まったくクリーンアップされない可能性があります。

于 2009-03-17T14:03:54.247 に答える
1

MSDNによると、次のusingコード:

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();
  }
}

また、コードが乱雑になることもありません。実際にはまったく逆です!

于 2009-03-17T14:07:53.443 に答える