C # CA2000: Entsorgen Sie Objekte, bevor Sie den Bereich mit FileStream / XmlTextReader verlieren

8

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?

    
The Diamond Z 27.06.2010, 18:49
quelle

7 Antworten

15

Seufzend, anstrengend, nicht wahr? Vermeiden Sie all dies mit der empfohlenen Create () -Methode:

%Vor%     
Hans Passant 27.06.2010, 19:15
quelle
11

Da niemand eine Lösung bereitgestellt hat, die dieses Problem bereits löst, schreibe ich hier meine Arbeitslösung:

%Vor%

Damit wird CA2000 entfernt.

    
testalino 13.09.2010 12:41
quelle
1

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

%Vor%

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).

    
Brian 27.06.2010 19:15
quelle
1

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.

    
CJBrew 18.08.2010 08:56
quelle
0

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.

    
sinelaw 03.01.2013 01:05
quelle
0

benutze einfach 'using' für den Filestream

%Vor%

Ändern Sie fs nicht und verwenden Sie fs.close () nicht innerhalb von geschweiften Klammern.

    
jaison jose 01.12.2014 14:00
quelle
-1

Verwenden Sie die using -Anweisung auch für den FileStream selbst, genau wie beim XmlTextReader.

Ссылка .

Grz, Kris.

    
XIII 27.06.2010 18:58
quelle

Tags und Links