Question

Par exemple,

int myResult= (new UnmanagedResourceUsingMemorySuckingPig()).GetThingsDone(id);

Il n’existe aucun bloc using, aucun moyen évident d’utiliser un bloc using, aucun moyen évident d’appeler Dispose (). Et bien sûr, UnmanagedResourceUsingMemorySuckingPig implémente IDisposable.

Était-ce utile?

La solution

Si le finaliseur de cette classe appelle Dispose () , oui. Si non, non.

(modifier) ?? Quelques informations supplémentaires :

  

Ne présumez pas que Dispose sera   appelé. Ressources non gérées appartenant à un   type devrait également être libéré dans un   Finaliser la méthode dans le cas où   Dispose n'est pas appelé.

Modifier

Pour clarifier la modification ci-dessus, j'ai vu beaucoup de personnes (dans ce fil, sur SO et ailleurs) affirmer que "Le GC appellera Dispose () lorsque l'objet sera supprimé." ; Ce n'est pas du tout le cas. Oui, un bon codeur défensif qui écrit un composant suppose que Dispose () ne sera pas appelé explicitement et le fait dans le finaliseur. Cependant, un bon codeur défensif UTILISANT un composant doit supposer que le finaliseur n'appelle PAS Dispose () . Il n'y a pas d'appel automatique de Dispose () dans le ramasse-miettes . Cette fonctionnalité est UNIQUEMENT en place si le finaliseur appelle Dispose () .

Autres conseils

Je ne crois pas. Vous devrez écrire:

 using (UnmanagedResourceUsingMemorySuckingPig urumsp = new UnmanagedResourceUsingMemorySuckingPig()) 
{
  myResult= urumsp.GetThingsDone(id);
}

Vous ne pouvez être sûr que s'il est doté d'un Finalizer (destructeur), celui-ci sera appelé. Un finaliseur peut appeler Dispose () mais l'implémentation habituelle est que le finaliseur et Dispose () appellent protected Dispose (bool) .

En d'autres termes, cela dépend de la mise en oeuvre de UnmanagedResourceUsingMemorySuckingPig , s'il respecte les consignes, l'objet anonyme sera nettoyé, mais pas aussi efficacement qu'avec un utilisant bloquer.

Non. Cependant, le GC finira par collecter l'objet et remarquera qu'il est finalisable (c'est-à-dire finalisable, non?) Et le finalisera pour vous. Dispose est destiné au nettoyage déterministe des ressources.

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