Lo que me gusta hacer es declarar los objetos sin inicializarlos, pero establecer sus valores predeterminados en Nothing
. Luego, al final del ciclo escribo:
If anObject IsNot Nothing Then anObject.Dispose()
Aquí tienes una muestra completa:
Public Sub Example()
Dim inputPdf As PdfReader = Nothing, inputDoc As Document = Nothing, outputWriter As PdfWriter = Nothing
GoodExit:
If inputPdf IsNot Nothing Then inputPdf.Dispose()
If inputDoc IsNot Nothing Then inputDoc.Dispose()
If outputWriter IsNot Nothing Then outputWriter.Dispose()
End Sub
Esto también funciona muy bien para colocar sus objetos principales en la parte superior de una rutina, usarlos dentro de una Try
rutina y luego desecharlos en un Finally
bloque:
Private Sub Test()
Dim aForm As System.Windows.Forms.Form = Nothing
Try
Dim sName As String = aForm.Name
Catch ex As Exception
Finally
If aForm IsNot Nothing Then aForm.Dispose()
End Try
End Sub
bool IsDisposed { get; }
declaración sobreSystem.IDisposable
.Dispose
método ordena a un objeto que libere todos y cada uno de los recursos que ha adquirido pero que aún no ha liberado. Si un objeto nunca contiene recursos, suDispose
método generalmente no tendrá que hacer nada; si el tipo lo declaravoid IDisposable.Dispose() {};
, puede ignorarloIDisposable
sin sobrecarga por instancia. UnaIsDisposed
propiedad que se esperaba que se hiciera verdadera después de cualquierDispose
llamada necesitaría agregar un indicador booleano que de otro modo sería innecesario a cada instancia de muchos tipos que de otro modo se podrían ignorarDispose
.IDisposable
, ¿cómo puede verificar si se ha eliminado primero? ¿En lugar de asumir que no lo es y detectar una excepción? ¿O de alguna manera está destinado a administrar la vida para que siempre sepa si se desecha o no?IsDisposed
bandera puede ayudar a evitar que el código pierda tiempo en operaciones que posiblemente no puedan tener éxito, pero aún así sería necesario manejar excepciones en el caso de que un objeto se elimine entre laIsDisposed
verificación y el intento de usarlo.WeakReference
parece relevante aquí. No es exactamente un detector IDipose'd, pero te dice si es GC'd