Gibt es einen richtigen Weg, um durch eine verfügbare Ressource nachzugeben? Die zurückgegebenen Objekte sind IDisposable, aber das Element, durch das sie iteriert, ist.
Hier ist ein Beispiel:
%Vor% Im Moment würde das Aufrufen der Ressource using
nicht erhalten. Ich weiß, dass ich nur zu einer ToList kann und alles auf einmal zurückschicke, aber gibt es eine Möglichkeit, dies "richtig" zu handhaben, oder muss ich eine Registerkarte auf der IDisposable-Ressource halten und sie manuell entfernen, wenn ich fertig bin?
Kurz gesagt, Sie müssen sich keine Gedanken darüber machen, solange der Aufrufer der Methode die IEnumerator
-Objekte richtig handhabt.
IEnumerator
implementes IDisposable
, und die Logik, die beim Erstellen der Iterator-Blöcke verwendet wird, ist tatsächlich intelligent genug, um alle nicht ausgeführten finally-Blöcke auszuführen, wenn sie entsorgt werden. Ein finally-Block wird als Ergebnis des Aufrufs using
erstellt, und dort wird die Ressource IDisposable
abgelegt.
Also solange die von diesem IEnumerator
erzeugten IEnumerable
Objekte entweder vollständig iteriert werden (in diesem Fall wird der letzte MoveNext
Aufruf das Ende des using
Blocks erreichen und die Ressource entsorgen) oder entsorgt Der IDisposable
Client wird entsorgt.
Beachten Sie, dass der Benutzer Ihres Codes die IEnumerator
-Objekte möglicherweise nicht korrekt behandelt, wenn Sie Bedenken haben, dass Sie am besten keinen Iteratorblock mit fauler Auswertung verwenden sollten. Wenn Sie sicherstellen möchten, dass, selbst wenn der Aufrufer nicht "nett" spielt, dann bewerten Sie die Methode eifrig (nehmen Sie den Code, den Sie haben, speichern Sie die Ergebnisse in einer Liste und geben Sie diese dann zurück). Wenn die Folgen, die Ressource nicht zu disponieren, hauptsächlich oder vollständig performance-bezogen sind (nicht eine gewisse Zeit Speicher freigeben, eine Verbindung offen halten, etc.), dann ist das kein Problem, aber wenn man die Sperre für immer festhält, ist a Hauptproblem (dh eine gesperrte Ressource, die zu Deadlocks führen könnte, wenn sie nicht freigegeben wird), dann ist der Vorteil einer faulen Evaluierung möglicherweise nicht wert.
Tags und Links c# yield-return