次の構文のコードスニペットがたくさん表示されます
using (RandomType variable = new RandomType(1,2,3))
{
// A bunch of code here.
}
変数を宣言して使用しないのはなぜですか?
このUsing構文は、コードを乱雑にし、読みにくくするようです。そして、その変数がそのスコープでのみ利用可能であることが非常に重要である場合、なぜそのブロックを関数に配置しないのですか?
次の構文のコードスニペットがたくさん表示されます
using (RandomType variable = new RandomType(1,2,3))
{
// A bunch of code here.
}
変数を宣言して使用しないのはなぜですか?
このUsing構文は、コードを乱雑にし、読みにくくするようです。そして、その変数がそのスコープでのみ利用可能であることが非常に重要である場合、なぜそのブロックを関数に配置しないのですか?
使用する目的は非常に明確です。
IDisposableを実装する型で使用するように設計されています。
あなたの場合、RandomTypeがIDisposableを実装している場合、ブロックの最後で.Dispose()が取得されます。
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を実装していないものをすべてキャッチします。
いいえ、コードが乱雑になったり、読みにくくなったりすることはありません。
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();
}
}
usingステートメントで使用されているオブジェクトはIDisposableを実装する必要があるため、スコープの最後でDispose()が呼び出されることが保証されているため、理論的には、その時点でオブジェクトを解放する必要があります。場合によっては、コードがより明確になることがわかりました。
usingキーワードは、オブジェクトが割り当てる管理対象または非管理対象のリソースをクリーンアップするための決定論的な方法を提供します。usingキーワードを使用しない場合は、そのオブジェクトの処理が終了したら、Dispose()(または場合によってはClose())を呼び出す必要があります。そうしないと、次のガベージコレクションまでリソースがクリーンアップされないか、まったくクリーンアップされない可能性があります。
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();
}
}
また、コードが乱雑になることもありません。実際にはまったく逆です!