0

次のステートメントはメモリ リークを引き起こしますか。

Imports System.Data.SQLClient

Public Function getConnection () As SQLConnection
    return New SQLConnection()
End Function

Public Sub TestConnection()
    Dim con As SQLConnection
    con = getConnection
    con.close
    con = Nothing
End Sub

.close または .dispose は、getConnection の SQLConnection でどのように呼び出されますか?

4

2 に答える 2

2

参照型を返しているため、TestConnection で同じインスタンスを操作するため、ここでメモリ リークは発生しません。最後に、null の 2 つのインスタンスがあります (gc がそれらを収集します) が、接続は閉じられています。

于 2012-11-16T15:22:12.650 に答える
1

メソッドを呼び出した後にガベージ コレクションが行われるため、メモリ リークは発生しません。

しかし、この方法は混乱を招くだけです。接続が終了したらすぐに (例外が発生した場合でも)、常に接続を破棄する必要があります (暗黙的に閉じます)。

これは、ステートメントTry/Finallyを使用して or (より簡単)の finally で行うことができます。Usingただし、どちらのアプローチも接続をラップする必要があるため、メソッドを使用すると、呼び出し元のメソッドがそれを忘れることができます。したがって、それは悪い習慣です。

したがって、単純にこれを行います:

Public Sub TestConnection()
    Using con = New SqlConnection("connection string here")
        Using cmd = new SqlCommand("sql query here", con)
            ' do something, f.e. cmd.ExecuteNonQuery() '
        End Using
    End Using
End Sub
于 2012-11-16T15:24:21.217 に答える