擦除数组 - 是否有必要?

时间:2013-01-15 11:50:35

标签: arrays vb.net

请查看以下代码:

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? (垃圾收集器是否处理此问题?)

2 个答案:

答案 0 :(得分:6)

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实现。

答案 1 :(得分:1)

  

是否甚至需要擦除数组并将其设置为空?

没有。 GC在自己的时间做到了这一点。 事实上,我甚至不确定Erase是否实际上可以释放金钱,或者它是否只是将数组指向别处。它只是将变量设置为NothingErase可能存在与VB6的兼容性。例如C#没有它(它也没有ReDim,虽然Array.Resize当然存在,尽管语义略有不同)。

另一方面,如果你的数组包含IDisposable个对象(它不包含),你应该通过遍历数组并在Dispose方法中处理那些依次处理它们。但同样,数组本身不需要删除。

作为一般评论,您的代码非常像VB6。改变这一点。不初始化变量时不要声明变量。不要使用UBound等(而是使用.Length属性)。如果您发现自己经常使用ReDim而不是数组。