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

网页功能如下所示:

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 对象都应该有一个有限的生命周期。当您将数组引用设为空时,它就不再有用了。

只需删除 IDisposable 实现。

于 2013-01-15T12:04:51.710 回答
1

甚至有必要擦除一个数组并将其设置为空吗?

不,GC 在它自己的时间里这样做。事实上,我什至不确定是否Erase真的可以释放资金,或者它是否只是将数组指向其他地方。它只是将变量设置为Nothing. Erase可能与 VB6 不兼容。例如,C# 没有它(它也没有ReDim,尽管Array.Resize当然存在,尽管语义略有不同)。

另一方面,如果您的数组包含IDisposable对象(它不包含),您应该通过迭代数组并依次处理它们来处理方法中的对象Dispose但同样,阵列本身不需要被擦除。

作为一般评论,您的代码读起来非常像 VB6。改变那个。不要在未初始化变量的情况下声明变量。不要使用UBound等(.Length而不是属性)。如果您发现自己ReDim经常使用 aSystem.Collections.Generic.List而不是数组。

于 2013-01-15T11:52:30.157 回答