Co chciałbym zrobić, to zadeklarować obiekty bez ich inicjowania, ale ustawić ich wartości domyślnych Nothing
. Następnie, pod koniec pętli piszę:
If anObject IsNot Nothing Then anObject.Dispose()
Powyżej znajduje się pełna próbka:
Public Sub Example()
Dim inputPdf As PdfReader = Nothing, inputDoc As Document = Nothing, outputWriter As PdfWriter = Nothing
'code goes here that may or may not end up using all three objects,
' such as when I see that there aren't enough pages in the pdf once I open
' the pdfreader and then abort by jumping to my cleanup routine using a goto ..
GoodExit:
If inputPdf IsNot Nothing Then inputPdf.Dispose()
If inputDoc IsNot Nothing Then inputDoc.Dispose()
If outputWriter IsNot Nothing Then outputWriter.Dispose()
End Sub
To również działa świetnie na oddanie najważniejszych obiektów w szczycie rutyny, wykorzystując je do środka Try
rutynowe i usuwania ich w Finally
bloku:
Private Sub Test()
Dim aForm As System.Windows.Forms.Form = Nothing
Try
Dim sName As String = aForm.Name 'null ref should occur
Catch ex As Exception
'got null exception, no doubt
Finally
'proper disposal occurs, error or no error, initialized or not..
If aForm IsNot Nothing Then aForm.Dispose()
End Try
End Sub
Dunno. Wydaje się być ciekawym, że nie ma 'bool IsDisposed {get; } 'deklaracja w' System.IDisposable'. – nicodemus13
@ nicodemus13: Metoda "Dispose" nakazuje obiektowi zwolnienie wszystkich zasobów, które uzyskał, ale jeszcze nie wydał. Jeśli obiekt nigdy nie posiada zasobów, jego metoda "Dispose" zazwyczaj nie będzie musiała nic robić; jeśli typ deklaruje 'void IDisposable.Dispose() {};' może w inny sposób zignorować 'IDisposable' bez narzutów dla instancji. Właściwość 'IsDisposed', która zgodnie z oczekiwaniami powinna stać się prawdziwa po wywołaniu' Dispose', wymagałaby dodania niepotrzebnej flagi Boolean do każdej instancji wielu typów, które w przeciwnym razie mogłyby zignorować 'Dispose'. – supercat
Ale gdziekolwiek wywołasz metodę na obiekcie, który implementuje 'IDisposable', jak możesz sprawdzić, czy został najpierw usunięty? Zamiast zakładać, że tak nie jest i złapać wyjątek? Albo jakoś masz zarządzać życiem, abyś zawsze wiedział, czy jest zbędny, czy nie? – nicodemus13