2009-10-30 14 views
7

「使用する」とスコープの違いは?

次の2つのコードスニペットの違いは何ですか:

using (Object o = new Object()) 
{ 
    // Do something 
} 

{ 
    Object o = new Object(); 
    // Do something 
} 

もっと多くのusingを使用し始めましたが、実際のメリットはスコープオブジェクト。

これは何らかの形でガベージコレクションを強制するわけではないことに注意してください。ガベージコレクションと迅速なリソースクリーンアップは、やや直感的です。

Eddinsはコメントします:

あなたのクラスがIDisposableインターフェイスを実装し、Dispose()関数を持っていない限り、あなたはuseを使用しません。

答えて

20

最初のスニペットは、ブロックの最後にDisposeを呼び出す - あなたはIDisposableを実装する型でそれをのみ行うことができます、そしてあなたは、リソースの清掃を必要とするタイプでそれを使用することができますので、それは基本的に、finallyブロックでDisposeを呼び出します例えば、これはどのような方法、形状または形態でない力ガベージコレクションを行うこと

using (TextReader reader = File.OpenText("test.txt")) 
{ 
    // Use reader to read the file 
} 
// reader will be disposed, so file handle released 

注意。ガベージコレクションと迅速なリソースクリーンアップは、やや直感的です。

基本的には、IDisposableを実装しており、コードブロックが(クリーンアップの点で)責任を負うものについては、usingステートメントを使用する必要があります。

+0

これは、クラスが保持する管理されていないリソースをクリーンアップする必要がある場合には、ほとんどこれに当てはまりますか?それとも純粋に管理されたクラスにも適用されますか? –

+0

ガベージコレクションに関する注釈の場合、私はいつもそれを忘れる傾向があります... – jdehaan

+0

いいえ、データ構造を保存するのに使われる典型的なオブジェクトは、using節から利益を得ることはできませんが、より重いオブジェクトIDisposableは? – Kelsey

3

usingの末尾にオブジェクトが配置されます(括弧の中に入れたオブジェクトはIDisposableを実装する必要があります)。例外的にオブジェクトも破棄されます。 GCがしばらくの間それを行うのを待つ必要はありません。

EDIT:スコーピングの欠点は、次のとおりです。

  • あなたは
  • オブジェクトの配置を制御しない、あなたのスコープの末尾に処分呼ぶだろうとしても、それは例外安全ではありません
1

IDisposableと決定可能なリソースの割り当て解除に関するドキュメントを参照してください。

using{}ブロックの最後に、確実にを割り当てることができます(ファイルハンドルを閉じる、データベース接続など)。)

0

usingは、IDisposableインターフェイスの実装が必要で、スコープの最後にDisposeメソッドを呼び出します。

オブジェクトを適切に処分するという猛烈な議論のために、他にもたくさんのスレッドがあります。

3

ちょうど文字通り違いを示すために...

using (FileStream fileStream = new FileStream("log.txt", FileMode.OpenCreate)) 
{ 
    //stuff with file stream 
} 

{ 
    FileStream fileStream = new FileStream("log.txt", FileMode.OpenCreate); 
    fileStream.Dispose(); 
} 

として

{ 
    FileStream fileStream = new FileStream("log.txt", FileMode.OpenCreate); 

    try 
    { 
    //stuff with filestream 
    } 
    finally 
    { 
    if (fileStream != null) 
     ((IDisposable)fileStream).Dispose(); 
    } 
} 

どこ...と同じであることがあるようです。

+0

+1です。 – Kelsey

関連する問題