0

私はしばらくの間いくつかのコードに取り組んできました。そして私は質問をしました:

これら2つのコードの違いは何ですか?

using (FORM formExemple = new FORM ())
{
formExemple.ShowDialog();
}

FORM formExemple = new FORM ();
formExemple.ShowDialog();
4

6 に答える 6

8

usingオブジェクトのDispose()メソッドを呼び出して、完了時にそれ自体をクリーンアップします。通常、開いている接続を閉じたり、メモリを解放したりするなどの処理を行います。それ以外の方法でインスタンス化する場合は、手動で行う必要があります。usingインターフェイスを実装するオブジェクトでのみ使用できます。これにより、オブジェクトIDisposableのメソッドが確実にDispose()存在します。

于 2012-09-26T20:26:00.680 に答える
6

usingブロックは、を実装するオブジェクトを自動的に破棄するために使用されますIDisposable。最初Dispose()のものはブロックの終わりに呼び出されます。usingブロックは、例外が発生した場合にオブジェクトが適切に破棄されることも保証します。

2つ目は、オブジェクトが不要になると開発者が確信している場合は、開発者が処理する必要はなく、処理する必要があります。

于 2012-09-26T20:25:45.830 に答える
5

いつものように、ドキュメントを参照してください-ステートメントのMSDN C#ガイドusingまたはC#仕様(C#5仕様のセクション8.13)。

このusingステートメントは、を実装する型でのみ使用できIDisposable、基本的に、例外がスローされた場合でも、最初の式(リソース取得式)に表示されるすべてのリソースがブロックの最後に配置されるようにします。最初のコードスニペットは、おおむね次のものと同等です。

FORM formExemple = new FORM(); // I hope you don't *really* use these names
try
{
    formExemple.ShowDialog();
}
finally
{
    formExemple.Dispose();
}

それよりも少しだけ多くのことがあります。

  • リソース取得式で宣言された変数のスコープは、usingステートメント自体です。
  • null値に対応
  • usingステートメント内の変数への変更に対処します(元の値は引き続き破棄されます)

基本的に、ネットワークストリーム、ファイルハンドル、データベース接続、グラフィックスオブジェクトなど、タイムリーな廃棄が必要なリソースのクリーンアップが容易になります。

于 2012-09-26T20:26:10.893 に答える
4

usingIDisposableインターフェースを実装しているオブジェクトで使用できるものです。を使用する理由は、フォームが完成したら、クリーンアップについて心配する必要がないためです。フォームのDisposeメソッドが呼び出され、すべてがクリーンアップされます。

2番目の例では、Disposeが呼び出されることはなく、オブジェクトはまだメモリ内にあり、ガベージコレクタがクリーンアップする必要があることを認識しない場合はしばらくの間存在する可能性があります。

于 2012-09-26T20:26:55.247 に答える
2

使用ステートメント..。

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

(上記のリンクから例を取りました)

...したがって、2つのコードスニペットの違い+-ブロック内tryの呼び出し。IDisposable.Dispose()finally

于 2012-09-26T20:27:31.860 に答える
-1

usingステートメントはformExempleのスコープを定義します。formExempleに割り当てられたメモリは、usingステートメントの制御外で解放されると解放されます。

于 2012-09-26T20:26:21.977 に答える