Ich habe viel Code wie folgt:
%Vor%Dies gibt mir die folgende Code Analysis Warnung:
%Vor%Wenn ich dem Vorschlag folge und das File.Open in eine using-Anweisung setze, bekomme ich folgendes:
%Vor%Ich benutze VS2010 und ich kann nicht anders, als zu denken, dass ich etwas falsch mache, aber ich sehe es nicht. Was mache ich falsch?
Seufzend, anstrengend, nicht wahr? Vermeiden Sie all dies mit der empfohlenen Create () -Methode:
%Vor%Ich rate nur; habe keine Zeit, jetzt eine vollständige Analyse durchzugehen.
Angenommen, der XmlTextReader
-Konstruktor "übernimmt die Eigentümerschaft" des übergebenen Streams, so dass die XmlTextReader
auch Dispose
des zugrunde liegenden Streams entsorgt. Das würde das Verhalten erklären, das du siehst. Vielleicht kann XmlTextReader
Konstruktor werfen, und in diesem Fall würde die ursprüngliche Warnung über fs
sinnvoll sein. Angesichts dieser Hypothese ist dieser Code jedoch
ist, denke ich, richtig, aber liefert immer noch eine falsche Warnung. Das riecht wie ein schönes Beispiel, das die Grenzen der statischen Analysewerkzeuge demonstriert.
Wie jemand anderes schon sagte, gibt es eine andere API, um den Reader direkt aus dem Dateinamen ( XmlReader.Create()
) zu erstellen, was all dies vermeidet (und zeigt, wie gut entworfene APIs für eine überraschende Vielzahl von Gründe).
Es ist ein bekanntes Problem
Wenn Sie einen StreamWriter anstelle von XmlTextReader (wie in der obigen Lösung) verwenden, können Sie eine ähnliche Methode über den entsprechenden Konstruktor verwenden. z.B.
%Vor%oder
%Vor%Aus der Dokumentation geht nicht hervor, ob die erste Form des Konstruktors überschrieben oder an eine Datei angehängt wird.
Wie in dieser Antwort erwähnt, ist die einzige Möglichkeit, es korrekt zu umgehen, wie in CA2202 empfohlen und einen äußeren Versuch verwenden -finally Block anstelle eines äußeren using Block. Setzen Sie das äußere IDisposable-Objekt in der inneren Verwendung auf null, um zu verhindern, dass auf es zugegriffen wird, sobald die innere Verwendung beendet ist.
Hier ist ein generischer Wrapper, der es "richtig" macht, dh um den schlecht designten XmlReader herum funktioniert (vielleicht hätte er nicht den Besitz des Streams übernehmen sollen? Nicht sicher, was der richtige Weg wäre)
Haftungsausschluss : Nicht wirklich getestet
%Vor%Beispielverwendung:
%Vor%Das ist ziemlich klobig, und Sie können argumentieren, dass es besser ist, stattdessen das try / set null / finally-Muster zu wiederholen. Aber für ein sich wiederholendes Muster von verschachtelten Usings würde ich es lieber so machen, als jedes Mal das Ganze zu wiederholen.
benutze einfach 'using' für den Filestream
%Vor%Ändern Sie fs nicht und verwenden Sie fs.close () nicht innerhalb von geschweiften Klammern.