C# 2008
Je travaille sur ce sujet depuis un moment maintenant, et je suis toujours confus quant à l'utilisation des méthodes finalize et dispose dans le code. Mes questions sont les suivantes :
-
Je sais que nous n'avons besoin d'un finaliseur que lorsque nous disposons de ressources non gérées. Cependant, si des ressources gérées font des appels à des ressources non gérées, est-il nécessaire d'implémenter un finaliseur ?
-
Cependant, si je développe une classe qui n'utilise pas de ressource non gérée - directement ou indirectement, dois-je implémenter la méthode de gestion des ressources ?
IDisposable
pour permettre aux clients de cette classe d'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 Finalize/dispose :
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 finalisateur, et normalement le finalisateur sera appelé par le GC, et le finalisateur appellera la méthode Dispose. Comme je n'ai pas de finalisateur, quand dois-je appeler la méthode Dispose ? Est-ce le client de la classe qui doit l'appeler ?
Ainsi, ma classe dans l'exemple s'appelle NoGateway et le client pourrait utiliser et disposer de la classe comme ceci :
using(NoGateway objNoGateway = new NoGateway()) { // Do stuff here }
La méthode Dispose est-elle appelée automatiquement lorsque l'exécution atteint 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 le
WebClient
dans ma classeNoGateway
classe. Parce queWebClient
met en œuvre laIDisposable
cela signifie-t-il queWebClient
utilise indirectement des ressources non gérées ? Existe-t-il une règle absolue pour suivre cette règle ? Comment puis-je savoir qu'une classe utilise des ressources non gérées ?
2 votes
Ce modèle de conception compliqué est-il réellement nécessaire pour résoudre ce problème de réduction des ressources ?