3

私の質問に対する答えを見つけるために無数のトピックを読むのにうんざりしていたので、この主題に関するさらに別のトピック:)

次のクラスがあるとしましょう。

public class MyClass
{
   private const string conString = "connection string";

   private int Operation()
   {
      int count = 0;

      using(var con = SqlConnection(conString))
      {
         string select_cmd = "SELECT * FROM TABLE";

         using(var cmd = new SqlCommand(select_cmd, con))
         {
            using(var reader = cmd.ExecuteReader())
            {
               while(reader != null && reader.Read())
                  count++;
            }
         }
      }

      return count;
   }

}

データベースへの接続はusingステートメント内でインスタンス化されるため、con.close()メソッドと最終的にはcon.dispose()メソッドが呼び出されますが、MyClassにIDisposableを実装する必要がありますか?MyClassは、スコープ外になるとガベージコレクションされますか?

編集:

お返事ありがとうございます、それは私が思ったことですが、それを明確にする必要がありました。もう1つ質問があります。

私のクラスにデータベースで何らかの作業を行う複数のOperations()がある場合、リソース消費の観点から、SqlConnectionメンバーを作成し、クラスコンストラクターでインスタンス化して開き、IDisposableを実装して閉じるのではなく実行することをお勧めします。各操作で「using」ステートメントを使用する(各操作でデータベースを開いたり閉じたりする)?もちろん、その方法では、ステートメントを使用する際にMyClassオブジェクトをインスタンス化して使用する必要があります。

4

3 に答える 3

3

いいえ、IDisposableを実装する必要があるのは、クラスがOperation()メソッドの外部でSqlConnectionインスタンスを保持している場合のみです。これにより、クラス自体と一緒に存続します(たとえば、クラスメンバーフィールドまたは財産)。

SqlConnectionインスタンスは、そのインスタンスがusingブロックでスコープ外になったため、クラスがスコープ外になる前にクリーンアップの対象としてマークされます。最も重要なことは、管理されていないデータベース接続(SqlConnectionによってカプセル化されている)がDispose呼び出しで解放されていることです。SqlConnectionの管理対象部分は、GCがGCパスの実行を正当化するのに十分なプレッシャーを感じたときに解放されます。

クラスインスタンスについても、GCの裁量で解放されます。これは、アプリの存続期間中にクラスのインスタンスを多数作成および破棄しない限り、心配する必要はありません(数百万だと思います)。

編集

2番目の質問では、メソッドごとにSqlConnectionインスタンスを使用して破棄することをお勧めします。これは、この特定のデータベースクライアントクラスが内部で接続プールを実装しているためです(つまり、しばらく破棄しても接続が実際に閉じられないため、新しい場合はSqlConnectionが作成され、開いている接続のプールから1つを再利用します)。

(古いが有効)を参照してください:http://msdn.microsoft.com/en-us/library/8xx3tyca%28v=vs.71%29.aspx

独自のプーリングを実装していないデータベースクライアントAPIを使用する場合は、提案どおりにこれを手動で管理する方がよい場合があります。ただし、接続へのアクセスの同期に注意する必要があり(つまり、2つのスレッドに同時に使用させないでください)、ライフタイムの問題を自分で管理する必要があります(たとえば、クラスがアプリの存続期間中ずっと存続している場合は、データベースリソースを無期限に開いたままにします...など)

最新のもの(MySql Connector.NET、SQL Server)のほとんどは、プーリングを実装しています。

于 2012-04-24T12:24:46.187 に答える
1

終了後Operation()、そのメソッドで使用されているすべての管理されていないリソースは破棄されます。を実装する理由はありませんIDisposableMyClass管理されていないリソースを開いたままにしないため、そのインターフェイスを実装する必要はありません。

2番目の質問に関しては、クラスのインスタンスは、他の管理対象オブジェクトと同じようにガベージコレクションされます。

于 2012-04-24T12:23:34.993 に答える
0

いいえ、IDisposableインターフェイスに実装する必要はありません。解放するリソースがありません。

于 2012-04-24T12:23:51.217 に答える