<p>L’objectif de Dispose <strong>est</strong> de libérer les ressources non managées. Cela doit être fait à un moment donné, sinon elles ne seront jamais nettoyées. Le ramasse-miettes ne sait pas <strong>comment</strong> appeler <code>DeleteHandle()</code> sur une variable de type <code>IntPtr</code>, il ne sait pas <strong>si</strong> il a besoin d’appeler <code>DeleteHandle()</code> ou non.</p>
<p><strong>Remarque</strong> : Qu’est-ce qu’une <em>ressource non managée</em> ? Si vous l’avez trouvée dans le Microsoft .NET Framework : elle est managée. Si vous avez fouillé vous-même dans MSDN, elle est non managée. Tout ce que vous avez utilisé via des appels P/Invoke pour sortir du monde douillet de tout ce qui est disponible dans le .NET Framework est non managé – et vous êtes désormais responsable de son nettoyage.</p>
<p>L’objet que vous avez créé doit exposer <em>une</em> méthode que le monde extérieur peut appeler pour nettoyer les ressources non managées. La méthode peut être nommée comme vous le souhaitez :</p>
<pre><code class="lang-auto">public void Cleanup()
</code></pre>
<p>ou</p>
<pre><code class="lang-auto">public void Shutdown()
</code></pre>
<p>Mais il existe un nom standardisé pour cette méthode :</p>
<pre><code class="lang-auto">public void Dispose()
</code></pre>
<p>Une interface a même été créée, <code>IDisposable</code>, qui ne contient que cette seule méthode :</p>
<pre><code class="lang-auto">public interface IDisposable
{
void Dispose();
}
</code></pre>
<p>Vous faites donc en sorte que votre objet expose l’interface <code>IDisposable</code>, et de cette manière vous promettez que vous avez écrit cette unique méthode pour nettoyer vos ressources non managées :</p>
<pre><code class="lang-auto">public void Dispose()
{
Win32.DestroyHandle(this.CursorFileBitmapIconServiceHandle);
}
</code></pre>
<p>Et c’est terminé.</p>
<p>Sauf que vous pouvez faire mieux</p>
<p>Que se passe-t-il si votre objet a alloué un <strong><a href="http://msdn.microsoft.com/en-us/library/system.drawing.bitmap.aspx">System.Drawing.Bitmap</a></strong> de 250 Mo (c’est-à-dire la classe Bitmap managée .NET) comme une sorte de tampon d’image ? Bien sûr, c’est un objet managé .NET, et le ramasse-miettes le libérera. Mais voulez-vous vraiment laisser 250 Mo de mémoire inutilisée – en attendant que le ramasse-miettes <em>finisse</em> par passer et la libérer ? Et s’il y a une <a href="http://msdn.microsoft.com/en-us/library/system.data.common.dbconnection.aspx">connexion de base de données ouverte</a></p>
<p><em>(Réponse tronquée)</em></p>