Ce que je veux faire est de déclarer les objets sans les initialiser, mais définir leurs valeurs par défaut Nothing
. Puis, à la fin de la boucle, j'écris:
If anObject IsNot Nothing Then anObject.Dispose()
Voici un échantillon complet:
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
Cela fonctionne également idéal pour mettre vos objets principaux en haut d'une routine, les utiliser à l'intérieur une routine Try
, puis les disposer dans un bloc 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. Il semble curieux qu'il n'y ait pas de 'bool IsDisposed {get; } 'déclaration sur' System.IDisposable'. – nicodemus13
@ nicodemus13: La méthode 'Dispose' ordonne à un objet de libérer toutes les ressources qu'il a acquises mais pas encore libérées. Si un objet ne détient jamais de ressources, sa méthode 'Dispose' n'aura généralement rien à faire; si le type déclare 'void IDisposable.Dispose() {};' il peut autrement ignorer 'IDisposable' sans surcharge par instance. Une propriété 'IsDisposed' qui était censée devenir vraie après tout appel' Dispose' nécessiterait l'ajout d'un indicateur booléen sinon inutile à toutes les instances de nombreux types qui pourraient autrement ignorer 'Dispose'. – supercat
Mais, lorsque vous appelez une méthode sur un objet qui implémente 'IDisposable', comment pouvez-vous vérifier si elle a été éliminée en premier? Plutôt que de supposer que ce n'est pas le cas et d'attraper une exception? Ou d'une manière ou d'une autre, vous êtes censé gérer la vie de sorte que vous devriez toujours savoir si elle est disposée ou non? – nicodemus13