Cet article a fait l'objet d'une traduction manuelle. Déplacez votre pointeur sur les phrases de l'article pour voir la version originale de ce texte. |
Traduction
Source
|
IDisposable, interface
Définit une méthode pour libérer des ressources allouées.
Assembly : mscorlib (dans mscorlib.dll)
Le type IDisposable expose les membres suivants.
Cette interface est essentiellement utilisée pour libérer des ressources non managées. Le garbage collector libère automatiquement la mémoire allouée à un objet managé lorsque cet objet n'est plus utilisé. Il est toutefois impossible de prévoir le moment auquel un garbage collection se produira. En outre, le garbage collector n'a pas connaissance des ressources non managées, telles que les handles de fenêtres et les fichiers et flux ouverts.
Utilisez la méthode Dispose de cette interface pour libérer explicitement les ressources non managées en association avec le garbage collector. Le consommateur d'un objet peut appeler cette méthode lorsque l'objet n'est plus nécessaire.
L'ajout de l'interface IDisposable à une classe existante constitue une modification avec rupture de version, car la sémantique de la classe est modifiée.
Important
|
|---|
|
Les programmeurs C++ doivent lire Destructors and Finalizers in Visual C++. Dans le .NET Framework, le compilateur C++ assure la prise en charge de l'implémentation de la suppression déterminable des ressources et n'autorise pas l'implémentation directe de la méthode Dispose. |
Pour obtenir une description détaillée de la manière dont cette interface et la méthode Object.Finalize sont utilisées, consultez les rubriques Garbage Collection et Implémentation d'une méthode Dispose.
Appel de l'interface IDisposable
Lors de l'appel d'une classe qui implémente l'interface IDisposable, utilisez le modèle try/finally pour vous assurer que les ressources non managées sont supprimées même si une exception interrompt votre application.
Pour plus d'informations sur le modèle try/finally, consultez Try...Catch...Finally, instruction (Visual Basic), try-finally (référence C#) ou try-finally Statement (C).
Notez que vous pouvez utiliser l'instruction using (Using en Visual Basic) à la place du modèle try/finally. Pour plus d'informations, consultez la documentation Using, instruction (Visual Basic) ou la documentation using, instruction (référence C#).
L'exemple de code suivant montre comment créer une classe de ressource qui implémente l'interface IDisposable.
using System; using System.ComponentModel; // The following example demonstrates how to create // a resource class that implements the IDisposable interface // and the IDisposable.Dispose method. public class DisposeExample { // A base class that implements IDisposable. // By implementing IDisposable, you are announcing that // instances of this type allocate scarce resources. public class MyResource: IDisposable { // Pointer to an external unmanaged resource. private IntPtr handle; // Other managed resource this class uses. private Component component = new Component(); // Track whether Dispose has been called. private bool disposed = false; // The class constructor. public MyResource(IntPtr handle) { this.handle = handle; } // Implement IDisposable. // Do not make this method virtual. // A derived class should not be able to override this method. public void Dispose() { Dispose(true); // This object will be cleaned up by the Dispose method. // Therefore, you should call GC.SupressFinalize to // take this object off the finalization queue // and prevent finalization code for this object // from executing a second time. GC.SuppressFinalize(this); } // Dispose(bool disposing) executes in two distinct scenarios. // If disposing equals true, the method has been called directly // or indirectly by a user's code. Managed and unmanaged resources // can be disposed. // If disposing equals false, the method has been called by the // runtime from inside the finalizer and you should not reference // other objects. Only unmanaged resources can be disposed. protected virtual void Dispose(bool disposing) { // Check to see if Dispose has already been called. if(!this.disposed) { // If disposing equals true, dispose all managed // and unmanaged resources. if(disposing) { // Dispose managed resources. component.Dispose(); } // Call the appropriate methods to clean up // unmanaged resources here. // If disposing is false, // only the following code is executed. CloseHandle(handle); handle = IntPtr.Zero; // Note disposing has been done. disposed = true; } } // Use interop to call the method necessary // to clean up the unmanaged resource. [System.Runtime.InteropServices.DllImport("Kernel32")] private extern static Boolean CloseHandle(IntPtr handle); // Use C# destructor syntax for finalization code. // This destructor will run only if the Dispose method // does not get called. // It gives your base class the opportunity to finalize. // Do not provide destructors in types derived from this class. ~MyResource() { // Do not re-create Dispose clean-up code here. // Calling Dispose(false) is optimal in terms of // readability and maintainability. Dispose(false); } } public static void Main() { // Insert code here to create // and use the MyResource object. } }
Windows 7, Windows Vista SP1 ou ultérieur, Windows XP SP3, Windows XP SP2 Édition x64, Windows Server 2008 (installation minimale non prise en charge), Windows Server 2008 R2 (installation minimale prise en charge avec SP1 ou version ultérieure), Windows Server 2003 SP2
Le .NET Framework ne prend pas en charge toutes les versions de chaque plateforme. Pour obtenir la liste des versions prises en charge, consultez Configuration requise du .NET Framework.
Important