Wie lassen sich konstruierte IDisposables sicher am besten zurückgeben?

8

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.

    
Eamon Nerbonne 16.12.2009, 15:26
quelle

4 Antworten

4

Ich glaube, das ist das Standardmuster:

%Vor%

Der Fehler wird nicht abgefangen und erneut ausgelöst.

    
Jeffrey L Whitledge 16.12.2009, 15:41
quelle
7

Nein - ich denke, es gibt keinen besseren Weg.

Sie könnten jedoch eine Hilfsklasse schreiben:

%Vor%

Sie könnten also schreiben:

%Vor%

Ich bin mir jedoch nicht sicher, ob das wirklich ein besserer Weg ist.

    
Matthias 16.12.2009 15:35
quelle
2

Sie könnten eine Erweiterungsmethode schreiben:

%Vor%

Damit können Sie Code wie folgt schreiben:

%Vor%     
Mark Seemann 16.12.2009 15:44
quelle
0

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.

    
Christian Hayter 16.12.2009 15:53
quelle

Tags und Links