C # 2008
J'y travaille depuis un certain temps maintenant, et je suis toujours confus quant à l'utilisation des méthodes de finalisation et d'élimination dans le code. Mes questions sont ci-dessous:
Je sais que nous n'avons besoin que d'un finaliseur pour disposer de ressources non gérées. Cependant, s'il existe des ressources gérées qui appellent des ressources non gérées, aurait-il encore besoin d'implémenter un finaliseur?
Cependant, si je développe une classe qui n'utilise aucune ressource non gérée - directement ou indirectement, dois-je implémenter le
IDisposable
pour autoriser les clients de cette classe à utiliser «l'instruction using»?Serait-il possible d'implémenter IDisposable juste pour permettre aux clients de votre classe d'utiliser l'instruction using?
using(myClass objClass = new myClass()) { // Do stuff here }
J'ai développé ce code simple ci-dessous pour démontrer l'utilisation de Finaliser / éliminer:
public class NoGateway : IDisposable { private WebClient wc = null; public NoGateway() { wc = new WebClient(); wc.DownloadStringCompleted += wc_DownloadStringCompleted; } // Start the Async call to find if NoGateway is true or false public void NoGatewayStatus() { // Start the Async's download // Do other work here wc.DownloadStringAsync(new Uri(www.xxxx.xxx)); } private void wc_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) { // Do work here } // Dispose of the NoGateway object public void Dispose() { wc.DownloadStringCompleted -= wc_DownloadStringCompleted; wc.Dispose(); GC.SuppressFinalize(this); } }
Question sur le code source:
Ici, je n'ai pas ajouté le finaliseur, et normalement le finaliseur sera appelé par le GC, et le finaliseur appellera Dispose. Comme je n'ai pas le finaliseur, quand dois-je appeler la méthode Dispose? Est-ce le client de la classe qui doit l'appeler?
Donc ma classe dans l'exemple s'appelle NoGateway et le client pourrait utiliser et éliminer la classe comme ceci:
using(NoGateway objNoGateway = new NoGateway()) { // Do stuff here }
La méthode Dispose serait-elle automatiquement appelée lorsque l'exécution atteindrait la fin du bloc using, ou le client doit-il appeler manuellement la méthode Dispose? c'est à dire
NoGateway objNoGateway = new NoGateway(); // Do stuff with object objNoGateway.Dispose(); // finished with it
J'utilise la
WebClient
classe dans maNoGateway
classe. ParceWebClient
qu'implémente l'IDisposable
interface, cela signifie-t-il queWebClient
indirectement utilise des ressources non gérées? Existe-t-il une règle stricte et rapide pour suivre cela? Comment savoir qu'une classe utilise des ressources non managées?