7

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

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

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

私はもっusing​​とたくさん使い始めましたが、オブジェクトをスコーピングすることと比較して実際の利点が何であるかについて興味があります。

編集:私がこれから取った便利な一口:

ジョン・スキート:

これは、いかなる方法、形状、形式でもガベージコレクションを強制するものではないことに注意してください。ガベージコレクションと迅速なリソースクリーンアップは、いくぶん直交しています。

エディンズはコメントしますか:

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

4

5 に答える 5

20

最初のスニペットはDisposeブロックの最後で呼び出します-実装する型でのみ実行できIDisposable、基本的Disposeにfinallyブロックで呼び出すため、リソースのクリーンアップが必要な型で使用できます。

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

これは、いかなる方法、形状、形式でもガベージコレクションを強制するものではないことに注意してください。ガベージコレクションと迅速なリソースクリーンアップは、いくぶん直交しています。

基本的に、実装し、コードブロックが(クリーンアップの観点から)責任を負うことになるusingほとんどすべてのステートメントを使用する必要があります。IDisposable

于 2009-10-30T16:15:22.560 に答える
3

オブジェクトの最後にusing破棄されます(括弧内に配置したオブジェクトはIDisposableを実装する必要があります)。オブジェクトは、例外の場合にも破棄されます。そして、GCがいつかそれを行うのを待つ必要はありません(あなたはそれを制御します)。

編集:スコープの欠点は次のとおりです。

  • オブジェクトの配置を制御しません
  • スコープの最後でdisposeを呼び出す場合でも、例外安全ではありません。
于 2009-10-30T16:15:55.757 に答える
3

文字通り違いを示すために...

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

と同じです...

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

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

一方

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

そのままです。

于 2009-10-30T16:55:23.290 に答える
1

IDisposableおよびdeterminableリソースの割り当て解除に関するドキュメントを参照してください。

簡単に言えば、using{}ブロックの最後で、割り当てられたリソースを確実に破棄できます(たとえば、ファイルハンドルを閉じる、データベース接続など)。

于 2009-10-30T16:16:04.383 に答える
0

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

オブジェクトを適切に配置することについての激しい議論については、他にもたくさんのスレッドがあります。

于 2009-10-30T16:18:22.460 に答える