web-dev-qa-db-fra.com

Que signifie le tilde avant un nom de fonction en C #?

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 (~).

148
Keith Sirmons

~ 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 de destructeurs autres que celui qui peut y être déclaré.
  4. Les destructeurs ne peuvent pas être utilisés avec des structures. Ils ne sont utilisés qu'avec des 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 devenue éligible à la destruction.
  6. Lorsqu'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 qu'un destructeur C++ standard ferait. En C #, vous ne le nommez pas Finalize - vous utilisez la syntaxe destructrice C++ de placer un symbole tilde (~) avant le nom de la classe.

Éliminer

Il est préférable de disposer des objets dans une méthode Close() ou Dispose() qui peut être appelée explicitement par l'utilisateur de la classe. Finalize (destructeur) sont appelés par le GC.

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

Quoi utiliser?

Il n'est pas légal d'appeler explicitement un destructeur. Votre destructeur sera appelé par le garbage collector. Si vous gérez de précieuses ressources 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.

190

Il s'agit d'un finaliseur . Pour être honnête, vous devriez très rarement avoir besoin d'écrire un finaliseur. Vous n'avez vraiment besoin d'en écrire qu'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 le rend plus facile
  • Vous implémentez IDisposable dans une classe qui n'est pas scellée. (Ma préférence est de sceller les classes à moins qu'elles ne soient conçues pour l'héritage.) Un finaliseur fait partie du modèle canonique Dispose dans de tels cas.
43
Jon Skeet

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

8
torial

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

4

Voir Destructeurs (Guide de programmation C #) . Sachez cependant que, contrairement à 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.

3
Jeff Stong

~ 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

1
stephenbayer