Bearbeiten: Zwei Optionen, die unten angezeigt werden.
Wenn Sie nur die Funktionalität verwenden, die ein IDisposable bietet, funktioniert die passende using
-Klausel einwandfrei. Wenn Sie in einem Objekt % hüllen und ein IDisposable
einfügen, muss das enthaltene Objekt selbst IDisposable
sein und Sie müssen das entsprechende Muster implementieren (entweder eine versiegelte IDisposable
-Klasse oder das unordentlichere aber standard virtual
Muster ).
Aber manchmal ist eine Hilfsfabrikmethode gut für die Sauberkeit. Wenn Sie direkt nach der Konstruktion ein IDisposable
zurückgeben, geht es Ihnen gut, aber wenn Sie es zuerst konstruieren und dann modifizieren oder anderweitig Code ausführen, der eine Ausnahme auslösen kann, müssen Sie .Dispose()
- aber nur wenn ein Fehler aufgetreten ist.
Zum Beispiel könnte unsicherer Code so aussehen ...
%Vor%Lösungen Zwei sichere Varianten folgen ...
%Vor%Die sichere Variante A ist nur eine Zeile länger, scheint aber der idiomatische Ansatz zu sein. Es scheint keine wirklich prägnanten Lösungen zu geben, obwohl einige Poster unten einige Lambda-nutzende Optionen angeben, die diese Logik kapseln.
Der Code Bloat mit einer der oben genannten sicheren Methoden bleibt, und ist besonders ärgerlich mit Code, der ursprünglich wie ...
sah %Vor%Der obige Code wird sicher geschrieben und ist ein wenig länger und weniger lesbar, weil Sie die gekürzte Setter-Syntax nicht mehr sicher verwenden können.
Ich glaube, das ist das Standardmuster:
%Vor%Der Fehler wird nicht abgefangen und erneut ausgelöst.
Sie könnten eine Erweiterungsmethode schreiben:
%Vor%Damit können Sie Code wie folgt schreiben:
%Vor%Ich denke, Sie verkomplizieren das Problem.
Wenn Ihre Methode ein Einwegobjekt zurückgibt, dann sagen Sie: "Ich gebe hiermit das Eigentum an diesem Objekt auf, zum Besseren oder Schlechteren". Wenn während des Aufbaus ein Fehler auftritt, warum sollte das einen Unterschied machen? Der aufrufende Code wird darüber hinaus auch dann verfügen, wenn Sie eine Ausnahme auslösen.
Zum Beispiel:
%Vor% Bearbeiten: Wenn eine Ausnahme in CreateCommand
geworfen wird, wird die cmd-Variable leider nie gesetzt und das Objekt wird nicht korrekt verteilt.
Tags und Links c# idisposable