7

重複の可能性: C#
での using ステートメントの使用
C# Using ブロックとは何ですか? なぜそれを使用する必要があるのですか?

これが何を意味するのか疑問に思っていますか?次の構文を持つ多くのチュートリアルをオンラインで見てきました。

using (SqlCeCommand cmd2 = new SqlCeCommand("SELECT city FROM cities JOIN states ON states.id=cities.state WHERE states.state='" + read.GetString(0) + "'", con))
{
  SqlCeDataReader readCities = cmd2.ExecuteReader();
  while (readCities.Read())
  {
    parent.Nodes.Add(readCities.GetString(0));
  }
}

なぜ使用されるのですか?Google で検索してみましたが、dll やその他のファイルを含めるために使用される「using」キーワードが表示されます。

4

8 に答える 8

33

usingステートメント_

using(var disposableObject = new object_that_implements_IDisposable()) { ... }

次のようなコードのシンタックス シュガーです。

var disposableObject = new object_that_implements_IDisposable()
try
{
    ...
}
finally
{
    if(disposableObject != null)
    {
        ((IDisposable)your_object).Dispose();
    }
}

これは、IDisposable を実装するクラスにのみ適用されます。たとえば、システム リソース (ファイル ハンドル、データベース接続、ソケットなど) を使用するオブジェクトがあるコードをクリーンアップするのに役立ちます。システム。

理論的には、.Dispose()呼び出しを省略できますが、ガベージ コレクターが保持されているリソースを解放するのを待つ必要があります。GC は、オブジェクトを解放してメモリ使用量を再利用するタイミングを知ることは得意ですが、オブジェクトを解放して他のシステム リソースを放棄させる必要があることを認識していません。したがって、所有者が使用するメモリが必要であると GC が判断するまで、これらの重要なリソースは放棄されない可能性があります。したがって、オブジェクトを使い終わったら、オブジェクトを破棄する必要があります (破棄可能な場合)。

/を使用usingする理由については、純粋にコーダーの好みです。それらをカスケードできるので、私は好きです:tryfinallyusing

using(var a = new class())
using(var b = new class())
using(var c = new class())
using(var d = new class())
{
    ...
}

try/でそれを行うには、さらに多くのコード行が必要になりますfinally

using追加の利点もあります。たとえば、x.Dispose直接呼び出すとNullReferenceExceptionif xis null がスローされる可能性がありますが、スローされusing(x)ません。

以下も参照してください。

于 2010-01-25T23:54:40.530 に答える
4

は、使用している変数usingでメソッドを呼び出すコードを記述するようにコンパイラに指示するだけです。ステートメントで使用できるのは、'IDisposable' を実装する型のみです。Disposeusing

あなたの例では、{} のコードが終了すると cmd2 が破棄されます。

于 2010-01-25T23:54:17.223 に答える
2

「オブジェクトまたはオブジェクトが破棄される範囲外のスコープを定義します」using ステートメント
を参照してください

于 2010-01-25T23:54:40.437 に答える
2

usingを実装するオブジェクトに適用されますIDisposable。ブロックを離れるときusing(通常、または例外を介してなど) に、使い捨てオブジェクトのDisposeメソッドが呼び出されるようにします。

于 2010-01-25T23:54:41.100 に答える
0

Usingステートメントはスコープを定義し、その外側のオブジェクトまたはオブジェクトが破棄されます。

于 2010-01-25T23:54:43.103 に答える
0

を使用するのは、リソースをクリーンアップするクールな方法です。{}catch{}finally{dispose} を試すのと同じです。効果的なc#にはこれに関する項目があり、10以上の同様の回答が得られるに違いありません。

http://www.amazon.com/Effective-Specific-Ways-Improve-Your/dp/0321245660

于 2010-01-25T23:54:52.707 に答える
0

このusingステートメントは、IDisposable インターフェイスを実装するオブジェクトを使用するスコープを定義します。ブロックが終了すると、オブジェクトはクリーンアップされます。見る:

http://msdn.microsoft.com/en-us/library/yh598w02.aspx

于 2010-01-25T23:55:54.490 に答える
0

http://msdn.microsoft.com/en-us/library/yh598w02(VS.80).aspxを参照してください。

using ステートメントは、その内部の変数をスコープにカプセル化します。実行が using ブロックを終了すると、その中のすべてのオブジェクトがメモリから破棄されます。DB 接続でこれが発生する可能性があるため、using ブロックが終了すると、その接続に割り当てられたリソースがクリーンアップされて閉じられます。

于 2010-01-25T23:56:24.880 に答える