Warum sollte implementieren eine Klasse IDisposable explizit statt implizit?
-
30-09-2019 - |
Frage
Ich war mit der FtpWebResponse Klasse und sah nicht, ein Entsorgen Methode. Es stellt sich heraus , dass die Klasse implementiert IDisposable, aber tut dies ausdrücklich so, dass Sie zuerst Entsorgen vor dem Aufruf Ihrer Instanz zu IDisposable werfen müssen:
// response is an instance of FtpWebResposne
((IDisposable) response).Dispose();
Warum der Designer einer Klasse würde wie dieses wählte IDisposable explizit zu implementieren? Wie Anthony Pegram sagt , Dinge zu tun, auf diese Weise verschleiert die Tatsache, dass das Objekt sollte für den durchschnittlichen Entwickler entsorgt werden, die nicht in der Dokumentation ist die Beratung jedes Mal, wenn er / sie eine Klasse verwendet.
Lösung
Dies geschieht normalerweise, wenn die Klasse eine Close
Methode, die genau die gleichen wie Dispose
ist. Das ursprüngliche Dispose
wird in einer expliziten Implementierung versteckt, so dass genau die gleiche Methode nicht zwei Namen hat.
Es ist offiziell hier empfohlen:
(P. S. Ich bin nicht einverstanden mit dieser Konvention.)
Andere Tipps
- Gelegentlich eine Klasse eine Dispose-Methode hat, den Teil der Schnittstelle ist aber muss nicht tatsächlich aufgerufen werden, da die einzige Ressource zu entsorgen Speicher ist. Memorystream zum Beispiel
- Wie bereits erwähnt von anderen, wenn die Klasse eine Close-Methode hat, die die gleiche Sache wie Entsorgen der Fall ist, wohl Entsorgen Sie nur die Unterstützung vorhanden sein muss „mit“ Muster, so dass es auch explizit sein kann.
Es ist ein wenig zu mir seltsam suchen. Für was es wert ist: die Basisklasse (WebResponse) implementiert eine Close () -Methode. Reflector zeigt, dass WebResponse die Dispose () -Methode nur Anrufe Close () und eine interne OnDispose virtuelle, die nichts tut.
ich beichten haben, dass es ein wenig zu mir riecht, aber ich wette, dass sie explizit IDisposable so umgesetzt, dass es keine Verwirrung in Intellisense würde schließen zwischen () aufrufen oder Dispose ().
Zusätzlich zu dem, was gesagt wurde, ich könnte, dass die Umsetzung vorschlagen IDisposable
ausdrücklich die Verwendung des using
Block fördert, da es auf jeder Art verwendet werden, die Geräte IDisposable
und es ist natürlich (die meisten Menschen sowieso) zu schreiben :
using (var response = GetResponse())
{
// do something
}
Dann folgt aus:
var response = GetResponse();
// do something
((IDisposable)response).Dispose();
Ich bin sicher nicht, dass würde ein Entwickler-Absicht in explizit Umsetzung IDisposable
sein, aber es ist möglich.