0

すべてのデータベース オブジェクトを適切に閉じて破棄するという点で、これがデータ アクセスを行う良い方法であるかどうか疑問に思っています。例えば:

Using conn As New SqlConnection(MyConnectionString)
  Using cmd As New SqlCommand("some SQL here", conn)
    ... add parameters ...
    conn.Open()
    Using dr As SqlDataReader = cmd.ExecuteReader()
      While dr.Read()
        ... do stuff ...
      Wend
    End Using
  End Using
End Using

入れ子Usingは容認できる慣習のようなものですか? Read() ループ内のある時点でメソッドを終了すると、Usingこのように使用すると、すべてのオブジェクトが適切にクリーンアップされることが保証されますか?

4

4 に答える 4

2

Usingtry/finally暗黙的なブロックでの整然とした破棄を保証します。

' THE FOLLOWING TRY CONSTRUCTION IS EQUIVALENT TO THE USING BLOCK
Dim resource As New resourceType
Try 
    ' Insert code to work with resource.
Catch ex As Exception
    ' Insert code to process exception.
Finally 
    ' Insert code to do additional processing before disposing of resource.
    resource.Dispose() 
End Try 

ネストされた using も同様の方法で機能します。コードのブロックを終了すると、ブロックが実行finallyされ、オブジェクトが適切に破棄されます。

http://msdn.microsoft.com/en-US/library/htd05whh(v=VS.80).aspx

于 2012-05-23T20:45:23.400 に答える
1

追加するには、Using ブロックが「舞台裏で」Try finally ステートメントを追加します。finally ステートメントでは、オブジェクトに対して IDisposable.Dispose を呼び出します。つまり、何をしても、何が起こっても、オブジェクトは破棄されます。

于 2012-05-23T20:46:40.037 に答える
0

あなたは VB.Net を書いているので、これは部分的にしか当てはまりませんが、StyleCop を使用している C# の人々にとっては、このような複数のusing ステートメントは StyleCop で例外2202 を引き起こします。

msdnリンクには、stylecop でのこのルールの有用性に関する反対意見の長いセクションがあります。

VB.Net コードで C# に対する StyleCops の警告に注意する必要があるかどうかについて、私は判断を下しません。

于 2012-05-23T20:52:32.920 に答える
0

はい、これで大丈夫です。IDisposable オブジェクトの Dispose メソッドは常に呼び出されます。

PS: この場合、Dispose メソッドには Close メソッドも含まれています。

于 2012-05-23T20:44:04.010 に答える