Question

Plusieurs fois il y a une méthode claire, qui supprime tous les éléments des collections, sont ces éléments disposés aussi.

Comme,

toolStripMenuItem.DropDownItems.Clear();

est suffisant, ou devrais-je appeler comme ça:

foreach (ToolStripItem item in toolStripMenuItem.DropDownItems)
{
  toolStripMenuItem.DropDownItems.Remove(item);
  item.Dispose();
}

Edit: Eh bien ToolStripItem est un exemple pas question, pour ceux qui dit assez clair est que je trouve un autre exemple, TabControl a également collection d'éléments et méthode claire. Mais TabControls peuvent avoir des contrôles complexes (au moins je), qui doit être explicitement Evacuer (même si elles sont automatiquement supprimé à un moment donné par GC, car ils prennent la mémoire énorme). Je suppose que la meilleure réponse est divo commentaire à disposer les éléments, puis appeler clair.

Était-ce utile?

La solution

Q: Est-ce que

A. Non - Clear ne jetez pas les articles (ils pourraient être utilisés dans d'autres parties de votre application)

Alors, si vos ToolStripItems sont standard .NET, devrait Clear être suffisant? Après réflexion, je dirais que « probablement pas ».

Oui, cela est vrai que si vous avez des références à ToolStripItem dans une autre partie de votre application, le .NET GarbageCollector va détruire (utiliser la classe destructor ) automatiquement. Mais, il ne sera pas appeler Dispose(true) méthode , qui est cependant nécessaire pour les composants IDisposable du formulaire.

Lire un cette et cette .

En fait, je crois que vous, cependant, doivent explicitement Dispose vos articles, comme les années ToolStrip Dispose, méthode ne (REMPLACER cette par yourToolStrip ):

if (!this.Items.IsReadOnly)
{
    for (int i = this.Items.Count - 1; i >= 0; i--)
    {
        this.Items[i].Dispose();
    }
    this.Items.Clear();
}

EDIT

J'ai aussi créé le fil suivant pour clarifier cette question de façon plus générale.

Autres conseils

Vous devez compter sur appel Dispose() lorsque vous avez affaire à la mémoire non géré, des ressources partagées ou de grandes zones de mémoire. Est-ce que ne semble le cas.

L'appel Clear ne jetez pas les articles, mais il supprime la référence de la collection aux articles. Si cela était la seule référence aux articles qu'ils seront déchets collectés automatiquement à un moment donné (que vous ne pouvez pas prédire, mais vous pouvez contrôler en utilisant la classe GC).

Je ne pense pas, plus, il peut causer de nombreux problèmes logiques parce que vous pouvez avoir référence à cet objet dans la collection pour une utilisation ultérieure. Si vous ne disposez pas de références à des objets que Garbage Collector disposera que des objets plus tard

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