2010-02-06 2 views
6

... wenn ich IDisposable in einer lokalen Variablen verwende, aber nicht Dispose() oder das using() -Muster aufruft.Gibt es eine FxCop-Regel für lokal verwendete IDisposables?

public void BadMethod() 
{ 
    var fs = new FileStream("file.txt", FileMode.Create); 
    fs.WriteByte(0x55); 
    // no dispose, no using() 
} 

Genau wie die "Types that own disposable fields should be disposable" Regel für Felder.


EDIT: ersetzt Memory von Filestream, weil Memory ordnet nur Speicher und verwendet nicht (unmanaged) Ressourcen, so jemand über einen obligatorischen Dispose() -Aufruf besprechen könnte.

+1

Warum würden Sie das wollen? Es ist sinnlos, die Erinnerung ist nicht wegwerfbar. Hoffentlich werden wir kein Werkzeug bekommen, das sagt, dass es ist, es wird den Geist des Programmierers irreparabel zerstören. –

+8

@nobugz: Es ist immer noch richtig hier Dispose auf MemoryStream tatsächlich aufzurufen. Die Tatsache, dass MemoryStream keine nicht verwalteten Ressourcen verwendet, ist ein Detail der * Implementierung *. Der ** Vertrag ** für MemoryStream besagt, dass IDisposable implementiert wird und daher immer Dispose aufgerufen werden sollte. Es ist * immer * besser, gegen den Vertrag zu kodieren als gegen die spezifischen Implementierungsdetails. – casperOne

+0

@capser: Ja, einige Programmierer mögen die Maschine, um ihnen zu sagen, was zu tun ist. Es ist eine Religion, die ich nicht abonniere, ich ziehe es vor, die Regel wissentlich zu brechen. Gehen Sie voran und tun Sie es auf Ihre Weise, Sie werden nie falsch bewiesen werden. Nur träge. –

Antwort

15

Gibt es eine FxCop-Regel dafür? Ja und nein. In FxCop 1.35, auf dem die Visual Studio 2005-Codeanalyse basiert, gab es eine Regel DisposeObjectsBeforeLosingScope, die genau dies tat.

In FxCop 1.36 (Visual Studio 2008-Codeanalyse) entfernten sie ihre Datenflussanalyse-Engine, was bedeutete, dass diese Regel ebenfalls entfernt werden musste.

Jedoch in der nächsten FxCop (Visual Studio 2010 Code-Analyse) scheint es, dass DisposeObjectsBeforeLosingScope zurückgegeben hat!

+0

+1. Wusste nicht, dass es 2010 hinzugefügt wurde. Obwohl ich der Regel nicht unbedingt zustimme, ist dies eine direkte Antwort auf die Frage. –

+0

BTW: Auf Ihrem zweiten Link: Was bedeutet "Rückgabe eines Einweg-Objekts erfordert, dass das Objekt in einem try/finally-Block außerhalb eines using-Blockes konstruiert wird" bedeuten ?? – ulrichb

+1

Sie decken dies tatsächlich in der Probe in diesem Artikel ab. Sehen Sie sich die 'OpenPort2'-Methode an. Wenn das Objekt erstellt wird, aber nicht initialisiert werden kann, sollte es grundsätzlich 'Dispose()' 'd sein, bevor die Ausnahme an den Benutzer übergeben wird (andernfalls wird der Gültigkeitsbereich überschritten). Ein 'using' wäre hier nicht angebracht, da der * caller * zu einem späteren Zeitpunkt' Dispose() 'aufrufen soll. – bobbymcr

Verwandte Themen