Dans les langages de programmation, un objet ne peut avoir qu'une variable pendant son existence, il ne peut plus être modifié après son instanciation. Par conséquent, la même cellule de mémoire ne peut pas être affectée à de nouvelles valeurs. Une gestion automatisée de la mémoire est donc nécessaire pour gérer les espaces inutilisés. Ces espaces inutilisés s'appellent garbage et tout le processus de gestion efficace de la mémoire s'appelle garbage collection..
L'objectif principal d'un ramasse-miettes est de séparer les objets morts des objets vivants et de récupérer l'espace pour les réutiliser. Fondamentalement, tout fonctionne sur le tas géré, qui n'est rien d'autre qu'un bloc de mémoire et le récupérateur de place vérifie périodiquement la mémoire de tas pour allouer de la mémoire à de nouveaux objets. Il existe deux méthodes pour libérer des ressources non gérées, telles que les fichiers et les connexions de base de données: Dispose et Finalize..
Cet article vous aide à comprendre la différence entre les deux.
L'élimination est un moyen standard pour les utilisateurs de demander aux objets de libérer leurs ressources et de ne pas essayer d'y accéder à nouveau. La méthode dispose permet de contrôler le nettoyage explicite de la mémoire en rendant les objets inutilisables..
Lorsque les utilisateurs appellent la méthode Dispose (), l'objet est censé libérer toutes ses ressources coûteuses, le rendant ainsi disponible pour une réutilisation. Il n’est jamais appelé par le ramasse-miettes qui n’est utilisé que lorsque la mémoire gérée devient rare. Une interface spéciale appelée «IDisposable» est utilisée pour décider où et comment mettre en œuvre Dispose (). Mais que se passe-t-il lorsque la méthode de disposition ne s'appelle pas?
Si la méthode dispose n'est pas appelée, le plan de secours consiste à utiliser la méthode Finalize () pour le nettoyage. Il est appelé par le ramasse-miettes pour effectuer un nettoyage final des ressources avant de libérer de la mémoire. Le concept de nettoyage en temps voulu devient inapplicable ici car au lieu de dé-allouer immédiatement la mémoire, l'objet est ajouté à la file d'attente de finalisation pour être détruit ultérieurement. Finalize s'apparente davantage à une sauvegarde mise en place en cas d'erreur de programmation et que la disposition ne nettoie pas les ressources, auquel cas la méthode Finalize () est appelée par le ramasse-miettes pour supprimer les objets inaccessibles dans la séquence de son choix..
La méthode Dispose est appelée pour accélérer la publication des ressources non gérées, telles que les descripteurs de base de données, les descripteurs de fichier, les sémaphores et autres objets alloués par le système d'exploitation. La méthode dispose est appelée pour exécuter le code requis pour nettoyer la mémoire inutilisée et les ressources rares telles que les handles GDI. En termes simples, la méthode dispose permet de contrôler le nettoyage explicite de la mémoire. La méthode Finalize, en revanche, fait partie de la récupération de place utilisée pour effectuer l'opération de nettoyage final sur un objet avant qu'il ne soit collecté. En termes simples, la méthode finalize est appelée pour libérer les ressources non gérées détenues par un objet avant sa destruction..
La méthode Dispose peut être appelée explicitement par le code utilisateur et la classe qui implémente la méthode pour disposer des ressources. Cependant, la mémoire ne peut pas être libérée tant que le ramasse-miettes n'a pas exécuté le processus de nettoyage. La méthode peut être appelée même si d'autres références à l'objet existent toujours. La méthode finalize, au contraire, peut être invoquée par le ramasse-miettes uniquement après avoir déterminé que la dernière instance d'objet mémoire est détruite et qu'il n'existe plus de référence à l'objet. Une fois la méthode finalize exécutée, l'objet est supprimé de la mémoire de tas..
Le processus de suppression d'un objet de la mémoire s'appelle un modèle de disposition, qui peut être utilisé pour les objets qui accèdent à des ressources non gérées, car le garbage collector ne peut pas récupérer les ressources non gérées. L’interface «IDisposable» ainsi qu’une méthode supplémentaire de Dispose (booléenne) sont implémentées et demandent la libération de ressources non gérées. Une méthode de finalisation est exécutée lorsque l'instance d'un objet est détruite avant sa désallocation. C'est une méthode non déterministe qui est laissée à la discrétion du ramasse-miettes et peut même ne pas se produire. Il ne doit pas être implémenté sur des objets gérés avant une nécessité extrême..
Il est beaucoup plus rapide d'utiliser une méthode de disposition plutôt que de procéder à une finalisation immédiate. Les destructeurs sont automatiquement convertis en méthode de finalisation au moment de l'exécution. Il est automatiquement appelé par le ramasse-miettes lorsque l'objet sort de la portée, ce qui se produit généralement lorsque l'instance de cet objet est détruite. Le problème avec la méthode finalize est qu’il n’est pas déterministe, c’est-à-dire qu’il n’est pas certain de récupérer la mémoire qui n’est plus référencée via le garbage collection. Cependant, il se peut que la mémoire ne soit pas immédiatement libérée; en fait, il peut ne jamais être appelé et il ne peut pas être forcé explicitement.
La principale différence entre les méthodes d'élimination et de finalisation est que la première est une méthode déterministe qui élimine instantanément les objets lorsqu'ils ne sont plus utilisés, tandis que la dernière est une méthode non déterministe pour l'allocation de ressources non gérées, ce qui en fait une méthode de secours pour libérer des objets. instances d'objet mémoire lorsqu'elles sortent de leur domaine avant leur désallocation. Il est toujours conseillé d’utiliser la méthode de disposition avant finalisation sauf si cela est extrêmement nécessaire..
En d'autres termes, finaliser est une sauvegarde mise en place pour nettoyer les ressources non gérées lorsque la méthode de mise au rebut ne peut pas être appelée en cas d'erreur de programmation. La méthode Finalize est appelée par le ramasse-miettes lorsqu'un objet est sur le point d'être expulsé de la mémoire heap..