2013-01-15 17 views
1

請看看下面的代碼:擦除數組 - 是否有必要?

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

在相關的一面註釋中,如果您的實例數據(或者您自己擁有一些非託管資源,例如操作系統句柄),則應該只使用「IDisposable」。否則不需要。 – tcarvin

回答

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

擦除語句的日期從舊版本的Basic版本開始,這種版本的手動內存管理是有用的。沒有更多的內存管理在.NET中是自動的。由於兼容性原因,它仍然受支持。它所做的就是將數組引用設置爲Nothing。所以你的代碼相當於:

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

所以沒有指向它。你應該從來沒有實現IDisposible將變量設置爲Nothing,這不是接口的合同。丟棄的物體可能永遠不會再使用。所以沒有必要將數組引用設置爲null,因爲這實際上並不會對垃圾收集堆上的真實數組對象做任何事情。我不能看到你想要幫助的場景,任何clsParameterValues對象都應該有一個有限的生命週期。當您將數組引用歸零時,它不再有用。

只需刪除IDisposable實現。

+0

謝謝。 +1,用於顯示Dispose實際上在做什麼,即將paramValues設置爲無。 – w0051977

1

是否有必要擦除數組並將其設置爲空?

不是。GC在自己的時間裏就這樣做了。 事實上,我甚至不確定Erase是否實際上是免費的,或者它是否只是將數組指向其他地方。它只是將變量設置爲NothingErase可能與VB6不兼容。例如C#沒有它(並且它也沒有ReDim,儘管當然存在Array.Resize,雖然語義稍微不同)。

在另一方面,如果你的數組包含IDisposable對象(事實並非如此),你應該通過遍歷數組了,反過來他們處置處置那些Dispose方法。但是同樣,數組本身不需要被擦除。

作爲一般性評論,您的代碼非常像VB6。改變這一點。不要在沒有初始化變量的情況下聲明變量。不要使用UBound等(這裏有.Length屬性)。如果您發現自己使用ReDim,則經常使用System.Collections.Generic.List而不是陣列。

+1

備註:擦除語句相當於將Nothing分配給每個數組變量。 – sloth

+0

@DominicKexel:[Erase語句相當於將Nothing分配給每個數組變量。](http://msdn.microsoft.com/en-us/library/83zyeke9(v = vs80))。aspx) – Neolisk

+0

+1用於參考VB6。謝謝。 – w0051977