请查看以下代码:
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
? (垃圾收集器是否处理此问题?)
答案 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
是否实际上可以释放金钱,或者它是否只是将数组指向别处。Nothing
。 Erase
可能存在与VB6的兼容性。例如C#没有它(它也没有ReDim
,虽然Array.Resize
当然存在,尽管语义略有不同)。
另一方面,如果你的数组包含IDisposable
个对象(它不包含),你应该通过遍历数组并在Dispose
方法中处理那些依次处理它们。但同样,数组本身不需要删除。
作为一般评论,您的代码非常像VB6。改变这一点。不初始化变量时不要声明变量。不要使用UBound
等(而是使用.Length
属性)。如果您发现自己经常使用ReDim
而不是数组。