41 votes

Quel est l'intérêt de remplacer Dispose (bool disposing) dans .NET?

Si j'écris une classe en C # qui implémente IDisposable, pourquoi ne suffit-il pas de simplement implémenter

 public void Dispose(){ ... } 
 

gérer la libération de ressources non gérées?

Est

 protected virtual void Dispose(bool disposing){ ... }
 

toujours nécessaire, parfois nécessaire ou autre chose?

43voto

Jon Skeet Points 692016

Le modèle complet, y compris un outil de finalisation, l'introduction d'une nouvelle méthode virtuelle et "d'étanchéité" de l'original de la méthode dispose est très à usage général, couvrant toutes les bases.

Sauf si vous avez direct poignées sur les ressources non managées (qui devrait être presque jamais), vous n'avez pas besoin d'un outil de finalisation.

Si vous scellez votre classe (et de mon point de vue sur l'étanchéité des classes dans la mesure du possible sont probablement bien connue maintenant - la conception de l'héritage ou de l'interdire) il n'y a aucun point dans l'introduction d'une méthode virtuelle.

Je ne me souviens pas la dernière fois que j'ai mis en oeuvre IDisposable dans un "complexe" de manière vs de le faire de la manière la plus évidente, par exemple

public void Dispose()
{
    somethingElse.Dispose();
}

Une chose à noter est que si vous allez pour vraiment robuste code, vous devriez assurez-vous que vous n'essayez pas de faire quoi que ce soit après que vous avez été éliminés, et de le jeter ObjectDisposedException le cas échéant. C'est un bon conseil pour les bibliothèques de classes qui seront utilisées par les développeurs du monde entier, mais c'est beaucoup de travail pour très peu de gain si c'est simplement une classe au sein de votre propre espace de travail.

31voto

Hamish Smith Points 5961

Il n'est pas strictement nécessaire. Il fait partie de la recommandé Jetables modèle. Si vous n'avez pas lu la Conception du Cadre des lignes Directrices sur ce (9.3 dans la première édition, n'ont pas la deuxième édition pratique désolé) alors vous devriez. Essayez ce lien.

Il est utile de distinguer entre jetables de nettoyage et finalisable garbage-collection-est-dénigrer-moi.

Vous n'avez pas à le faire de cette façon, mais vous devez la lire et de comprendre pourquoi il est recommandé, avant de l'écarter comme inutile.

14voto

Hans Passant Points 475940

Il y a un peu de biais dans les MSFT docs sur le modèle jetable. Il y a deux raisons pour lesquelles vous devriez mettre en œuvre IDisposable:

  1. Vous avez des champs d'un type qui implémente IDisposable
  2. Vous avez un outil de finalisation.

Le cas 1 est assez commun dans la plupart des code. Le cas 2 est assez commun dans le code de Microsoft à l'écrit, ils ont été ceux qui ont écrit la gestion de wrappers autour des ressources non managées, ceux qui ont besoin de finalisation. Mais il doit être très rare dans votre code. Après tout, vous avez toutes ces belles .NET les classes pour faire le sale boulot pour vous. Vous avez juste à appeler leur Dispose() méthodes.

Seul cas 2 exige que les jetables modèle. Microsoft a besoin de beaucoup l'utiliser. Vous aurez juste besoin d'une simple Dispose() la plupart du temps.

5voto

Hosam Aly Points 14797

En plus des autres bonnes réponses, vous pouvez consulter ces articles:

3voto

Bob Points 34449

La méthode supplémentaire avec l'élimination du bool est sortie quelque part d'une directive de conception de cadre. Il s'agit simplement d'un modèle permettant à votre classe de pouvoir appeler la méthode dispose plusieurs fois sans lever d'exception. Ce n'est pas absolument nécessaire. Techniquement, vous pouvez le faire dans la méthode d'élimination.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X