-1

以下のコードをご覧ください。

Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles Me.Load
        Dim objCommand As SqlCommand
        Dim objCon As SqlConnection
        Dim p1 As Person
        Try
            p1 = New Person
            p1.DoSomething()
            objCommand = New SqlCommand
            Using objCommand
                Dim strConString As String = "Data Source=IANSCOMPUTER;Initial Catalog=Test;Integrated Security=True"
                objCon = New SqlConnection
                Using objCon
                    objCon.ConnectionString = strConString
                    objCon.Open()
                    objCommand.Connection = objCon
                    objCommand.CommandText = "select startdate from person "
                    Dim objDR As SqlDataReader = objCommand.ExecuteReader
                    If objDR.HasRows Then
                        objDR.Read()
                        Using objCon
                            Dim startdate As String = objDR("startdate")
                        End Using
                    End If
                End Using
            End Using
        Catch ex As Exception

            Throw
        Finally
            If objCon.State = ConnectionState.Open Then
                objCon.Close()
            End If
            objCon = Nothing
            objCommand = Nothing
            p1=Nothing 'This line is still needed
        End Try
    End Sub

接続とコマンドが Using ステートメントでラップされているため、finally 句のコードが無意味であることは理解しています。

しかし、アンマネージ リソースを使用しない Person のような独自のカスタム クラスがある場合はどうなるでしょうか。例外がスローされるかどうかに関係なく、(ヒープ上の) オブジェクトへの参照が何も設定されないようにするために、このインスタンスで FINALLY 句が必要になることは確かですか?

4

1 に答える 1

1

オブジェクトがメソッドから参照される場合、変数を Nothing に設定する必要はありません。これは、メソッド呼び出しが終了するとすぐに、オブジェクトが「ルート解除」され、ガベージ コレクションに使用できるようになるためです。メソッド呼び出しが終了すると、スタック上のすべてのローカル変数がなくなり、それらが参照するオブジェクトにはそれらへのルート化された参照がなくなり、ガベージ コレクションで使用できるようになります。Nothing一般に、ヒープ上のオブジェクトを管理するために参照カウントに依存しないため、.NET の変数を (vb.net で設定することによって) 「無効にする」必要はありません。

.NET でメモリの割り当てと割り当て解除がどのように機能するかの概要については、この記事を参照してください。

于 2013-03-24T12:45:54.193 に答える