Microsoft design guidelines mention modèle Dispose et scénarios comment l'utiliser:Ai-je vraiment besoin d'un modèle de base pour le référencement d'autres objets IDisposables?
Ænglisc le modèle Dispose de base sur les types contenant des instances de types à usage unique. Voir la section Modèle d'élimination de base pour les détails sur le motif de base.
Plus tard, ils montrent le modèle Dispose de base comme suit:
public class DisposableResourceHolder : IDisposable {
private SafeHandle resource; // handle to a resource
public DisposableResourceHolder(){
this.resource = ... // allocates the resource
}
public void Dispose(){
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing){
if (disposing){
if (resource!= null) resource.Dispose();
}
}
}
Mes des questions sont:
- Pourquoi avons-nous besoin de mettre en œuvre Dispose (bool) si elle a juste un seul appel avec le paramètre vrai? Il pourrait être facilement simplifié à
Dispose() {resource?.Dispose();}
sans paramètre. Notez que nous n'avons pas besoin de finaliseur ici car les objets que nous référençons sont gérés et ont leurs propres finaliseurs, donc ils ne seront pas divulgués. - Pourquoi recommandent-ils d'appeler le
GC.SuppressFinalize(this)
sans avoir de finaliseur? De toute façon, le GC n'appellerait pas le finaliseur parce qu'il n'existe pas! - Le seul cas où je vois le besoin de Dispose (bool) est quand nous avons vraiment des références non gérées, qui n'implémente pas IDisposable ni finalizer (comme montré dans this article). Mais alors la signification de
bool disposing
seraitbool includingManagedResources
. Alors, pourquoi cela est-il si trompeur de «disposer» de ce qu'il devrait faire en fait?
Ce n'est pas le cas. Microsoft s'inquiète de ces choses parce qu'ils ont écrit des classes qui ont des finaliseurs. N'écrivez jamais votre propre finaliseur. Il a juste fallu du temps à Microsoft pour le découvrir, puis ils ont créé les classes SafeHandle. –
Le motif derrière ce modèle est celui qui peut hériter de votre classe et cette classe héritée peut avoir le finaliseur. Et non - vous n'avez pas besoin de faire ça. – Evk
@Evk qui a vraiment du sens ... Merci! –