2008-10-09 5 views

Répondre

169

~ est le destructor

  1. Destructeurs sont invoquées automatiquement et ne peut être invoquée 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'autres destructeurs 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 aucun 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 Finaliser effectue les opérations qu'une norme C++ destructor ferait. En C#, vous ne le nommez pas Finalize - vous utilisez la syntaxe destructeur C++ de placer un symbole tilde (~) avant le nom de la classe.

Jeter

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

L'interface IDisposable indique au monde que votre classe contient des ressources qui doivent être éliminé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 doit utiliser la méthode GC.SuppressFinalize() pour vous assurer que la finalisation de votre instance est supprimée.

Que utiliser?

Il n'est pas légal d'appeler un destructeur explicitement. Votre destructeur sera appelé par le garbage collector. Si vous manipulez de précieuses ressources non managées (telles que des handles de fichiers) que vous souhaitez fermer et éliminer le plus rapidement possible, vous devez implémenter l'interface IDisposable.

+1

Je ne sais pas comment c'était dans le passé. Mais maintenant les destructeurs sont hérités. Consultez ce lien pour plus d'informations (consultez l'exemple à la fin): http://msdn.microsoft.com/en-us/library/66x5fx1b.aspx – RononDex

+0

@RononDex point 3 de la page même que vous liez aux états * "Finalizers ne peut pas être hérité "*, ce qui contredit votre commentaire. C'est un peu confus car, même s'ils ne peuvent pas être hérités *, la méthode 'Finalize' est appelée de façon récursive pour toutes les instances de la chaîne d'héritage, du plus dérivé au moins dérivé" *. Notez que ce n'est pas le même comportement que celui que vous obtiendriez des destructeurs hérités. –

+0

@MarkAmery ah je vois, donc fondamentalement ils sont appelés dans l'ordre inverse par rapport à quelque chose qui est hérité? – RononDex

7

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

+1

En C#, le terme correct est "finaliseur", pas "destructor". –

+11

Ils sont tous les deux corrects, selon les spécifications C# que vous avez lues. La plus récente MS (unifiée C# 3.0) se réfère à eux en tant que destructeurs (par exemple section 10.13) mais la spécification ECMA se réfère à eux comme finaliseurs. –

+0

@ 1800INFORMATION: L'élément * syntaxique * est correctement appelé un destructeur. Si une classe a un destructeur, un compilateur C# générera automatiquement un finaliseur qui inclut un bloc try/finally généralement inutile qui garantit que la méthode parentale Finalize est appelée. La plupart des choses qui sont vraies pour les destructeurs sont vraies pour les finaliseurs, et vice versa, mais les mots signifient des choses légèrement différentes. – supercat

4

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

2

~ représente généralement un déconstructeur. qui est exécuté juste avant qu'un objet ne meure.

Here is a description of C# deconstructors i found

+1

le terme correct devrait être destructeur/finaliseur, pas déconstructeur. Deconstructor signifie une syntaxe pour déconstruire un constructeur. –

40

C'est un finalizer. Pour être honnête, vous devriez très rarement écrire un finaliseur. Vous avez vraiment besoin d'écrire un si:

  • Vous avez un accès direct à une ressource non gérée (par exemple, par 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é. (Ma préférence est de sceller les classes sauf si elles sont conçues pour l'héritage.) Un finaliseur fait partie du modèle canonique Dispose dans de tels cas.
3

Voir Destructors (C# Programming Guide). Sachez cependant que, contrairement à C++, le programmeur n'a aucun contrôle sur le moment où le destructeur est appelé car il est déterminé par le garbage collector.

-1

Un point sur le Finalizer ci-dessus, sur la situation que vous pourriez avoir à appeler. Vous en avez besoin pour libérer des ressources non gérées, qui sont plus courantes que vous ne le pensez, généralement pour les bases de données. SQLConnection est un exemple sur lequel vous devez toujours appeler Dispose() lorsque vous avez terminé.

Un article: http://www.codeproject.com/KB/cs/idisposable.aspx