2009-06-27 6 views
48

ich diese Warnung von FxCop bekommen:Wie erweitere ich die Dispose-Methode eines WinForms?

„‚RestartForm‘Feld‚RestartForm.done‘enthält, die von IDisposable-Typ ist.‚Manual‘Ändern Sie die Dispose-Methode auf‚RestartForm‘entsorgen oder in der Nähe zu nennen auf diesem Feld. "

Ok, ich verstehe, was das bedeutet, und warum das ist, was getan werden muss ... Außer System.Windows.Forms.Form erlaubt Ihnen nicht, entweder .Close() oder .Dispose() außer Kraft zu setzen, so was zu tun ist? Zur Zeit laufe ich mit dieser Lösung:

Was funktioniert wie für meine Anwendung vorgesehen ... Aber FxCop zeigt immer noch diese Nachricht. Bin ich bedeckt und kann ich es gefahrlos ignorieren, oder gibt es eine andere Möglichkeit, dass ich das tun sollte?

+2

Sie können auch auf Disposed Ereignis in Ihrem Konstruktor abonnieren, wenn Sie Designer generierten Code nicht berühren wollen. – arbiter

Antwort

86

Sie benötigen die Dispose Methode von Form

außer Kraft zu setzen Normalerweise diese automatisch in der RestartForm.Designer.cs Datei überschrieben wird, so dass Sie die bewegen müssen Sie können in Ihre Codedatei einfügen, sodass Sie den Code hinzufügen können, den Sie hinzufügen möchten, ohne dass der Designer sie neu schreibt.

In den RestartForm.cs

protected override void Dispose(bool disposing) 
{ 
    if (disposing) 
    { 
    if (components != null) 
    { 
     components.Dispose(); 
    } 

    // Dispose stuff here 
    } 

    base.Dispose(disposing); 
} 
+5

Dies ist genau das, was mir gefehlt hat ... Ich habe nicht einmal daran gedacht zu prüfen, ob der Designer es in seinen automatisch generierten Code geschrieben hat ... Erklärt, warum es nicht in der Überschreibungsliste war, es wurde bereits implementiert, einfach nicht von mir! –

+0

Wo gebe ich meine Sachen ab, wenn "disposing" und "components! = Null" in derselben Zeile ausgewertet werden? Z.B. 'if (disposing && (components! = null))' (Standard für vs2013) –

+1

@firsttimer, die Logik ist die gleiche. Sie müssen die Methode aus Ihrer Designer-Datei entfernen und dann die Bedingungen auflösen. Ihr Code sollte wie oben in meinem Beispiel aussehen, wenn Sie fertig sind. – heavyd

0

Sie müssen die Dispose-Methode, diese Methode comes from the Control Basisklasse

protected override void Dispose(bool disposing) 
{ 
    if (disposing) 
    { 
    event.Dispose(); 
    } 
    base.Dispose(disposing); 
} 
2

außer Kraft setzen Wenn RestartForm System.Windows.Forms.Form erstreckt, sollten Sie in der Lage sein Entsorgen außer Kraft zu setzen (bool disposing). Sie sollten dies ordnungsgemäß für Ihre "RestartForm" -Klasse implementieren, um Ihre IDisposables zu entfernen.

Es sollte wie folgt aussehen:

public override Dispose(bool disposing) 
{ 
    if (disposing) 
    { 
     // Dispose was called from user code. Dispose of managed resources here. 
     done.Dispose(); 
    } 

    // Dispose of unmanaged resources here, and invoke base dispose. 
    base.Dispose(disposing); 
} 
6

Ich benutze diese Methode :)

  Image bgImage = Image.FromFile(workingDir + "\\" + button.BackgroundImage); 
      currentButton.Image = bgImage; 
      currentButton.Disposed += (Object sndr, EventArgs evnt) => bgImage.Dispose(); 
Verwandte Themen