Lo que me gusta hacer es declarar los objetos sin inicializar ellos, pero establece sus valores por defecto a Nothing
. Luego, al final del bucle escribo:
If anObject IsNot Nothing Then anObject.Dispose()
Este es un ejemplo completo:
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
Esto también funciona muy bien para poner sus objetos principales en la parte superior de una rutina, su uso en el interior una rutina Try
y, a continuación, disponiéndolos en un bloque Finally
:
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. Parece curioso que no haya un 'bool IsDisposed {get; } 'declaration on' System.IDisposable'. – nicodemus13
@ nicodemus13: el método 'Dispose' dirige un objeto para liberar todos y cada uno de los recursos que ha adquirido pero que aún no se han liberado. Si un objeto nunca posee recursos, su método 'Dispose' generalmente no tendrá que hacer nada; si el tipo declara 'void IDisposable.Dispose() {};' puede ignorar 'IDisposable' sin ninguna sobrecarga por instancia. Una propiedad 'IsDisposed' que se esperaba que se convirtiera en cierta después de cualquier llamada' Dispose' necesitaría agregar un indicador booleano innecesario a cada instancia de muchos tipos que de lo contrario podrían ignorar 'Dispose'. – supercat
Pero, donde sea que llame a un método en un objeto que implemente 'IDisposable', ¿cómo puede verificar si se ha desechado primero? En lugar de asumir que no es y atrapar una excepción? ¿O de alguna manera está destinado a administrar la vida útil para que siempre sepa si está dispuesto o no? – nicodemus13