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.

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top