2

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

Imports System.Data.Common
Imports System.Data.SqlClient
Imports System.Data.OracleClient

Public Class clsParameterValues
    Implements IDisposable

    Private paramValues(0) As DbParameter

    Public Function AssignParameterValues(ByVal strParameterName As String, ByVal strParameterValue As String, ByVal intDatabaseType As Integer) As Integer
        Dim intArrayBound As Integer

        intArrayBound = UBound(paramValues)
        If intArrayBound > 0 Then
            ReDim paramValues(intArrayBound)
        End If

        If intDatabaseType = 1 Then

            paramValues(intArrayBound) = New SqlParameter(strParameterName, strParameterValue)
        ElseIf intDatabaseType = 2 Then
            paramValues(intArrayBound) = New OracleParameter(strParameterName, strParameterValue)
            'paramValues(intArrayBound) = New OracleParameter(":" & strParameterName, OracleType.Int32)
            'paramValues(intArrayBound).Value = strParameterValue
        End If
        Return intArrayBound
    End Function

    Public Function getParameterValues() As DbParameter()
        Return paramValues
    End Function

    Public Sub Dispose() Implements IDisposable.Dispose
        Erase paramValues
        paramValues = Nothing
    End Sub

End Class

Web ページ関数は次のようになります。

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            Dim objParameterValues As New clsParameterValues
                Using objParameterValues
                    'Use the objParameterValues class here.
                End Using
                objParameterValues=nothing
            End Using
End Sub

IDisposable.Disposeに設定する前にアレイを消去するために使用していNothingます。Array クラスは を実装していないため、これは悪い習慣だと思いますIDisposable。配列を消去してに設定する必要さえありNothingますか? (ガベージコレクターはこれを処理しますか?)

4

2 に答える 2

7
Public Sub Dispose() Implements IDisposable.Dispose
    Erase paramValues
    paramValues = Nothing
End Sub

Erase ステートメントは、手動のメモリ管理が便利だった古いバージョンの Basic にまでさかのぼります。もう必要ありません。.NET ではメモリ管理が自動的に行われます。互換性の理由から、引き続きサポートされます。配列参照を Nothing に設定するだけです。したがって、コードは次と同等です。

Public Sub Dispose() Implements IDisposable.Dispose
    paramValues = Nothing
    paramValues = Nothing
End Sub

だから意味がない。IDisposibleを実装して変数を Nothing に設定しないでください。これはインターフェイスの契約ではありません。破棄されたオブジェクトは二度と使用できません。したがって、ガベージ コレクション ヒープ上の実際の配列オブジェクトに対して実際には何もしないため、配列参照を null に設定しても意味がありません。それ以外の場合、あなたが助けたいと思うシナリオを見ることはできません.clsParameterValuesオブジェクトの有効期間は制限されている必要があります. 配列参照を null にすると、もう役に立ちません。

IDisposable 実装を削除するだけです。

于 2013-01-15T12:04:51.710 に答える
1

配列を消去して何も設定する必要さえありますか?

いいえ。GC は独自の時間でそれを行います。Erase実際、実際にお金を解放するのか、それとも配列を別の場所に向けるだけなのかさえわかりません。変数を に設定するだけですNothingEraseおそらくVB6との互換性から存在します。たとえば、C#にはそれがありません(また、セマンティクスはわずかに異なりますが、もちろん存在しますが)もありません)ReDimArray.Resize

一方、配列にIDisposableオブジェクトが含まれている場合 (含まれていない場合) 、配列を反復処理して順番に破棄することにより、メソッドのオブジェクトを破棄する必要があります。Disposeただし、配列自体を消去する必要はありません。

一般的な意見として、コードは VB6 と非常によく似ています。それを変更します。初期化せずに変数を宣言しないでください。UBoundetcを使用しないでください(.Length代わりにプロパティがあります)。配列の代わりにReDima を頻繁に使用していることに気付いた場合。System.Collections.Generic.List

于 2013-01-15T11:52:30.157 に答える