2009-05-29 6 views
1

Ich fing an, mit FXCop gegen einige meiner Assemblys herumzuspielen und bemerkte etwas Interessantes, dass ich versuche, meinen Kopf einzuwickeln.FXCop: "Typen, die Einwegfelder besitzen, sollten wegwerfbar sein"

„Typen, die Wegwerf-Mitglieder erklären sollte auch IDisposable implementieren. Wenn der Typ keine unmanaged Ressourcen besitzen hat, keine Finalizerthread auf sie umzusetzen.“

Ich habe meine eigene Klasse, die einige Steuerelemente enthält, die wiederum von System.Web.UI.WebControls.Button erben. Es beschwert sich nicht über meine geerbten Knöpfe, aber die Klasse, die sie umschließt, ist.

Was ist die Auswirkung oder die Gefahr hier?

Antwort

1

Was ist die Art der Klasse, die die Schaltflächen enthält?

Normalerweise würde ich nur erwarten, dass eine Klasse, die ein zusammengesetztes Steuerelement ist, andere Steuerelemente als Mitglieder haben. Eine solche Klasse würde normalerweise direkt oder indirekt von System.Web.UI.CompositeControl oder System.Web.UI.WebControl erben, und die Steuerelemente, die Sie als Member haben, sollten der Controls-Auflistung hinzugefügt werden.

Dadurch wird sichergestellt, dass sie ordnungsgemäß entsorgt werden und die FxCop-Warnung beseitigt werden sollte.

Veröffentlichen Sie weitere Details der betreffenden Klasse, wenn dies nicht hilft.

+0

Ausgezeichneter Punkt, ich denke, dass ich diesen Weg gehen werde. Vielen Dank! – Chris

4

Wenn Ihre Klasse IDisposable-Typen enthält, aber Ihre Klasse nicht IDisposable ist, ist es möglich, dass die IDisposable-Typen innerhalb Ihrer Klasse nicht rechtzeitig freigegeben/freigegeben werden, wenn eine Instanz Ihrer Klasse nicht mehr benötigt wird. Dispoble-Typen sollten entsorgt werden, sobald Sie sie nicht mehr benötigen, damit Ressourcen freigegeben werden. Wenn Sie das nicht tun, müssen Sie warten, bis der GC eintritt, dann werden auch die Ressourcen freigegeben.

2

Wie Sie wissen, sollten Sie nach der Verwendung eines Einwegobjekts die Methode Dispose aufrufen. Wenn Sie von diesen Steuerelementen erben, ist es weiterhin möglich, die Methode Dispose aufzurufen. Wenn Sie jedoch einen Wrapper erstellen, sollte der Benutzer Ihrer Wrapper-Klasse in der Lage sein, Dispose aufzurufen.

public void Dispose() { 
    button.Dispose(); 
    // any other thing that is disposable 
}