10

なぜusingC# でステートメントを使用するのだろうか。調べたところ、ステートメントの実行とオブジェクトのクリーンアップに使用されていることがわかりました。私の質問:{ }スコープを定義するために中かっこ ( ) を開いたり閉じたりしても同じことではありませんか?

使用ステートメント:

using (SqlConnection conn = new SqlConnection(connString)) {
     SqlCommand cmd = conn.CreateCommand();
     cmd.CommandText = "SELECT * FROM Customers";
     conn.Open();
     using (SqlDataReader dr = cmd.ExecuteReader()) {
          while (dr.Read()) 
          // Do Something...
     }
}

中括弧:

{
     SqlConnection conn = new SqlConnection(connString);
     SqlCommand cmd = conn.CreateCommand();
     cmd.CommandText = "SELECT * FROM Customers";
     conn.Open();
     {
          SqlDataReader dr = cmd.ExecuteReader();
          while (dr.Read()) 
          // Do Something...
     }
}

2 つの方法に大きな違いはありますか?

4

6 に答える 6

5

まあ、使用しIDisposableます(クラスがインターフェースを実装している場合にのみ有効です)

using (SqlConnection conn = new SqlConnection(connString)) {
  // Some Code
  ...
}

このコードブロックと等しい

SqlConnection conn = null;

try {
  SqlConnection conn = new SqlConnection(connString);

  // Some Code
  ...
}
finally {
  if (!Object.ReferenceEquals(null, conn))
    conn.Dispose();
}

C#はC++と同じ動作をしないため、C++ のように C# で {...} パターンを使用しないでください。

{
  SqlConnection conn = new SqlConnection(connString);
  ...
  // Here at {...} block exit system's behavior is quite different:
  //
  // C++: conn destructor will be called, 
  // resources (db connection) will be safely freed
  //
  // C#:  nothing will have happened! 
  // Sometimes later on (if only!) GC (garbage collector) 
  // will collect conn istance and free resources (db connection). 
  // So, in case of C#, we have a resource leak 
}
于 2013-08-14T09:37:31.263 に答える
1

使用するとき

using( ...){
... code
}

これは実際には using パターンです。C# コンパイラは、using ブロックで作成されたオブジェクトによって実装された dispose メソッドを呼び出すコードを発行します。

したがって、IDisposable インターフェイスを実装するオブジェクトには、次を使用できます。

using(var disposableObject = new DisposableObject()){
}

これがコンパイルされると、コンパイラは以下のコードを生成します

DisposableObject disposableObject = null;
try
{
   disposableObject = new DisposableObject();
}
finally{
   disposableObject.Dispose();
}

したがって、using (..) ステートメントは、using ステートメント内で例外がスローされた場合でも、使い捨てオブジェクトの dispose メソッドが呼び出されるようにします。

于 2013-08-14T09:54:43.033 に答える
1

名前空間は名前のルックアップを変更しますが、中括弧はローカル変数を作成できる新しいスタックを作成します。

于 2013-08-14T09:34:21.893 に答える
1

version with key using を使用すると、NET プラットフォームはメソッドDisposeを実行して、オブジェクトが使用したリソースを解放します。したがって、オブジェクトはIDisposableインターフェイスを実装する必要があります。このようにして、決定論的な方法でリソースを解放します (ガベージ コレクターとは異なります)。

GCは管理されていないリソースをクリーンアップしないため、メソッドDisposeで管理されていないリソースをクリーンアップすることを強くお勧めします。

中かっこは、その中で使用される変数のスコープのみを決定しますが、ランタイムが右かっこに到達した後、リソースをクリーンアップしません。GCは、そのアルゴリズムに従って非決定論的な方法でそれを行います。

于 2013-08-14T09:43:37.587 に答える
0

使用は次と同等です

SqlConnection conn;
try
{
   conn = new SqlConnection(connString)
}

finally
{
  conn.Dispose() //using does this automatically for you
}

ルールは、いくつかのクラスが実装されているIDisposable場合、try catch の代わりに USing ブロックを使用でき、最後にパターン化することです。

GC の仕組みについて詳しく知りたい場合は、Jeffery Richterによるこの優れた記事をお読みください。

于 2013-08-14T09:27:01.337 に答える