Question

Je regarde du code et il a cette déclaration:

~ConnectionManager()
{
    Dispose(false);
}

La classe implémente l'interface IDisposable , mais je ne sais pas si cela fait partie de l'utilisation du tilde (~).

Était-ce utile?

La solution

~ est le destructeur

  1. Les destructeurs sont invoqués automatiquement et ne peuvent pas être invoqués explicitement.
  2. Les destructeurs ne peuvent pas être surchargés. Ainsi, une classe peut avoir au plus un destructeur.
  3. Les destructeurs ne sont pas hérités. Ainsi, une classe n'a pas d'autre destructeur que celui qui peut être déclaré.
  4. Les destructeurs ne peuvent pas être utilisés avec des structures. Ils ne sont utilisés qu'avec les classes. Une instance devient éligible à la destruction lorsqu'il n'est plus possible pour un code d'utiliser l'instance.
  5. L'exécution du destructeur pour l'instance peut avoir lieu à tout moment après que l'instance est éligible à la destruction.
  6. Quand une instance est détruite, les destructeurs de sa chaîne d'héritage sont appelés, dans l'ordre, du plus dérivé au moins dérivé.

Finaliser

En C #, la méthode Finalize effectue les opérations effectuées par un destructeur C ++ standard. En C #, vous ne nommez pas Finalize - vous utilisez la syntaxe de destructeur C ++ qui consiste à placer un symbole tilde (~) avant le nom de la classe.

Éliminer

Il est préférable de supprimer les objets dans une méthode Close () ou Dispose () pouvant être appelée explicitement par l'utilisateur de la classe. Finalize (destructor) est appelé par le GC.

L’interface IDisposable indique au monde entier que votre classe détient des ressources devant être supprimées et offre aux utilisateurs un moyen de les libérer. Si vous devez implémenter un finaliseur dans votre classe, votre méthode Dispose devrait utiliser la méthode GC.SuppressFinalize () pour garantir que la finalisation de votre instance est supprimée.

Quoi utiliser?

Il n'est pas légal d'appeler explicitement un destructeur. Votre destructeur sera appelé par le ramasse-miettes. Si vous gérez des ressources précieuses non gérées (telles que des descripteurs de fichiers) que vous souhaitez fermer et éliminer le plus rapidement possible, vous devez implémenter l'interface IDisposable.

Autres conseils

Il s'agit d'un finalizer . Pour être honnête, vous devriez très rarement avoir besoin d'écrire un finaliseur. Vous n’avez vraiment besoin que d’en écrire un si:

  • Vous avez un accès direct à une ressource non gérée (par exemple, via un IntPtr ) et vous ne pouvez pas utiliser SafeHandle , ce qui simplifie la tâche
  • Vous implémentez IDisposable dans une classe non scellée. (Ma préférence est de sceller les classes sauf si elles sont conçues pour l'héritage.) Dans ce cas, un finaliseur fait partie du modèle canonique Dispose.

Il est utilisé pour indiquer le destructeur de la classe.

Identique à C ++, c'est le destructeur; cependant, en C #, vous ne l'appelez pas explicitement, il est appelé lorsque l'objet est collecté.

Voir Destructors (Guide de programmation C #) . Sachez cependant que, contrairement au C ++, le programmeur n’a aucun contrôle sur le moment où le destructeur est appelé, car cela est déterminé par le garbage collector.

~ représente généralement un déconstructeur. qui est exécuté juste avant la mort d’un objet.

Voici une description des déconstructeurs C # que j'ai trouvés

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