2009-05-29 8 views

Répondre

2

Oui, avec certaines langues. C++/CLI émettra des appels Dipose pour les implémenteurs IDisposable lorsque leurs allocations non heap tombent hors de portée (en leur donnant effectivement la même sémantique que la ressource allouée par la pile en C++ normal). De plus, la syntaxe destructeur C++/CLI de ~ Classname devient une implémentation de Dispose (et rend la classe implémente IDisposable).

Je m'attendrais à ce que d'autres langues ayant une destruction déterministe traditionnelle adoptent cette politique au fil du temps. Comme d'autres l'ont mentionné, vous pouvez l'émuler en C# avec "using", mais ce n'est pas tout à fait la même chose.

1

S'il implémente IDisposable et que vous utilisez un bloc using, bien sûr.

3

No.

Si vous avez besoin pour nettoyer les ressources autres que la mémoire, la mise en œuvre IDisposable et créer vos objets avec using blocs. Si vous avez besoin de nettoyer la mémoire, vous pouvez vraiment le laisser au garbage collector.

0

Non, il n'y en a pas.

0

Non, il n'y a pas de finalisation déterministe dans un langage .NET. Le garbage collector est responsable de la finalisation des objets qui n'ont pas de racines dans l'application.

+1

Il ne posait pas de questions sur la finalisation, il demandait à être informé. Et comme il n'est disponible dans aucun langage .NET, si vous programmez en C++/CLI (le successeur de Managed C++ apparu dans VS2005), vous pouvez déclarer une référence à un objet comme s'il s'agissait d'une variable auto . Si la classe de cet objet implémente IDisposable, elle sera notifiée lorsqu'elle sortira de sa portée. C'est une caractéristique malheureusement manquante de C# IMHO. – U62

+0

btw. ce n'était pas moi qui l'ai déprécié! – U62

0

Si elle implémente IDisposable, votre méthode Dispose() découvrirait:

using (var c = new YourClassImplementsIDisposable()) 
{ 
    // Stuff happens 
} 
// c.Dispose has been called 

sinon pas, parce que votre objet est tout simplement 'traîner' jusqu'à ce que GC

Questions connexes