Question

Est-il nécessaire de gérer manuellement la durée de vie des objets System.Drawing?

Actuellement, j'utilise des instructions "à l'aide" pour réduire la durée de vie des pinceaux et autres objets de dessin, par exemple.

using ( Brush br = new SolidBrush( color ) )
{
    // Do something with br
}

Est-ce nécessaire ou est-il prudent de laisser le ramasse-miettes fonctionner comme par magie quand et si il le faut?

En guise de réponse rapide à la question ... quel est le moyen le plus propre d’atteindre cet objectif, selon les gens?

Était-ce utile?

La solution

Il est bon de supprimer un objet System.Drawing. Toutefois, si vous en manquez une ou deux lorsque vous obtenez une exception, etc., ce n'est pas la fin du monde. (D'autres objets, tels que les fichiers ouverts et les connexions à la base de données doivent toujours être supprimés )

.

Avoir beaucoup de & # 8220; Utiliser & # 8221; déclaration partout dans votre code le rendre plus complexe à comprendre. Par conséquent, dans le cas d’un objet System.Drawing, envisagez d’appeler simplement Dispose () à la fin de la méthode.

Dans le passé, j’avais utilisé une classe où j’avais écrit "Dustcart & # 8221;", qui implémentait IDisposable et qui contenait une collection d’objets à supprimer. Vous pouvez ensuite écrire du code tel que:

using(var dustcart = new Dustcard())
{
   var p = dustcart.Add(new Pen(red, etc));
   var b = dustcart.Add(new Brush(black));

   Pen t;
   if (someFlag)
   {
      t = p;
   }
   else
   {
      t = dustcard.Add(new Pen(etc));
   }
}

Autres conseils

Lorsqu'un objet est identifiable, il est préférable de le supprimer dès que vous n'en avez plus besoin. (Il implémente IDisposable pour une raison).

Bien sûr, lorsque vous oubliez d'appeler Dispose, le ramasse-miettes fera son travail à un moment donné et le nettoie, de sorte que les ressources soient libérées, mais vous ne pouvez jamais dire ou deviner quand le ramasse-miettes va entrer en action. n'est pas déterministe.

Mon conseil est donc: appelez Dispose manuellement (comme vous le faites maintenant) dès que vous n’avez plus besoin de l’objet jetable.

La règle générale est que si un objet implémente IDisposable, vous devez le nettoyer. IDisposable n'est pas implémenté sur un caprice dans le .NET Framework - il y a de bonnes raisons pour qu'il soit là.

Comme l'ont dit les autres: lorsque vous créez un objet identifiable, vous devez le supprimer le plus rapidement possible. Dans votre exemple spécifique, si la couleur est connue au moment de la compilation, vous pouvez utiliser un pinceau standard tel que Brush br = Brushes.Blue dont vous n’avez pas besoin de vous débarrasser.

Si vous réutilisez la même couleur à plusieurs reprises, vous pouvez stocker le pinceau en tant que membre de niveau classe. Toutefois, cela signifie que la classe propriétaire doit également être IDisposable et que le membre du pinceau est également placé dans sa méthode dispose. Cela augmenterait la mémoire de stockage (par la taille d'un pinceau), mais pourrait réduire la quantité de code (pas d'instructions using mais un remplacement supplémentaire par Dispose).

J'utilise l'instruction "using" comme vous l'avez décrit dans votre question pour garantir la suppression correcte du pinceau, du stylo, de la police de caractères et de toute ressource. Dans mon code, je trouve les instructions using plus propres que d'avoir des appels explicites .Dispose () dispersés. Mais ce n’est que ma préférence.

Je suis cependant d’accord avec les réponses ci-dessus: que vous préfériez utiliser des instructions ou des appels .Dispose, il est très important de nettoyer les ressources manuellement, plutôt que de compter sur le ramasse-miettes. (Je m'appuyais d'abord sur le ramasse-miettes et les problèmes de performances ont commencé à apparaître, avant même que les choses ne deviennent compliquées dans l'application.)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top