7
votes

Objectif de disposer de l'appel d'appeler (iSDisposing) modèle en C #?

Voici le code de MSDN . Je ne comprends pas pourquoi le travail n'est pas juste fait dans la méthode Dispose régulière () ici. Quel est le but de disposer de la méthode Dispose (BOOL)? Qui voudrait jamais appeler (faux) ici? XXX


0 commentaires

4 Réponses :


15
votes

Le finaliseur appellerait Dispose (faux) - Auquel cas, vous ne touchez aucune des autres ressources gérées (pouvant déjà avoir été finalisées).

Personnellement, je ne suive pas ce modèle souvent - parce que je n'ai que très rarement un finisseur, et il est également rare que je puisse écrire une implémentation non scellée . Si vous écrivez une classe scellée sans finaliseur, j'irais une implémentation simple.


6 commentaires

Vous devez toujours suivre ce modèle si vous encapsulez une ressource iDisposable dans une classe non scellée, cependant, les sous-classes peuvent donc être traitées correctement (et de manière cohérente).


Même si aucun finaliseur n'est nécessaire.


@Reed: La seule raison de le faire lorsque des sous-classes sont impliquées, c'est que ils peuvent avoir des finaliseurs - sinon pourquoi vous embêter avec un paramètre qui sera toujours vrai?


+1 sur le "Je ne suis pas ce modèle", c'est utile si vous avez une poignée Win32 ou similaire, mais autrement inutile car vous ne devriez pas avoir de finaliseur.


@Jon: True, sauf que, pour fournir une méthode de jettement virtuelle () à vos sous-classes, vous devez modifier le nom (puisque vous ne pouvez pas avoir d'éliminer et de disposer de virtuel protégé, à moins que vous n'ayez mis en œuvre, éliminez explicitement) - mais dans Tout cas, il s'agira d'une mise en œuvre non standard que votre sous-classe traitera. Pourquoi ne pas leur fournir exactement ce qui est attendu?


@Reed: Qu'est-ce qui ne va pas avec juste une méthode virtuelle virtuelle ()?



3
votes

Ceci permet à la finaliseur de travailler la propriété, ainsi que de permettre aux sous-classes qui découlent de votre classe à disposer correctement.

Si vous souhaitez plus d'informations détaillées, j'ai écrit un 5 Série de blogs de pièce sur Idisposable , et couvrait le problème de sous-classement en détail dans le Sous-classe d'un article de classe Idisposable .


0 commentaires

0
votes

Votre méthode d'élimination (disposition) ne doit pas explicitement libre de ressources s'il est appelé de finaliser, car ces ressources peuvent être déjà libérées par GC.

Donc, éliminer (disposer) devrait vérifier si elle s'appelle manuellement ou de GC et agit de manière judicieuse.


0 commentaires

1
votes

Concernant la réponse,

Votre méthode d'élimination (élimination) ne devrait pas explicitement libérer des ressources s'il est appelé de finaliseur, car ces ressources peuvent être déjà libérées par GC.

Il manque un mot important. Cela devrait vraiment dire:

Votre méthode d'élimination (élimination) ne devrait pas explicitement libérer finalisable (c'est-à-dire géré) si elle s'appelle de finaliseur, car ces ressources peuvent être déjà libérées par GC. Seules les ressources natives doivent être publiées dans un finaliseur.

Je suis sûr que l'affiche signifiait cela mais n'était pas assez explicite dans le poteau :)


0 commentaires