2009-06-27 8 views
48

Je reçois cet avertissement FxCop:Comment étendre la méthode Dispose d'un WinForm?

« 'RestartForm' contient le champ 'RestartForm.done' qui est de type IDisposable:. 'ManualResetEvent' Changer la méthode Dispose sur 'RestartForm' appeler Dispose ou Fermer sur ce terrain. "

Ok, je comprends ce que cela signifie et pourquoi cela est ce qui doit être fait ... Sauf System.Windows.Forms.Form ne vous permet pas de remplacer soit .Close() ou .Dispose(), donc ce qu'il faut faire? Actuellement je cours avec cette solution:

private void RestartForm_FormClosing(object sender, FormClosingEventArgs e) 
    { 
     done.Set(); 
     done.Close(); 
    } 

Qui fonctionne comme prévu pour mon application ... Mais FxCop montre toujours ce message. Suis-je couvert et puis-je l'ignorer en toute sécurité, ou y a-t-il une autre façon de le faire?

+2

Vous pouvez également vous abonner à l'événement Disposé dans votre constructeur, si vous ne voulez pas toucher concepteur code généré. – arbiter

Répondre

86

Vous devez remplacer la méthode Dispose de Form

Typiquement, cela est automatiquement remplacé dans le fichier RestartForm.Designer.cs, vous devrez déplacer le Disposez-le dans votre fichier de code pour pouvoir ajouter le code que vous souhaitez ajouter sans qu'il soit réécrit par le concepteur.

Dans les RestartForm.cs

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

    // Dispose stuff here 
    } 

    base.Dispose(disposing); 
} 
+5

C'est exactement ce qui me manquait ... Je n'ai même pas pensé à vérifier si le concepteur le mettait dans son code généré automatiquement ... Explique pourquoi il n'était pas sur la liste de remplacement, il était déjà implémenté, mais pas par moi! –

+0

Où est-ce que je mets mes trucs de disposition au cas où 'disposition 'et' composants! = Null' sont évalués sur la même ligne? Par exemple. 'if (disposant de && (components! = null))' (par défaut pour vs2013) –

+1

@firsttimer, la logique est la même. Vous devez déplacer la méthode hors de votre fichier de concepteur, puis rompre les conditions. Votre code devrait ressembler à mon exemple ci-dessus lorsque vous avez terminé. – heavyd

0

Vous devez remplacer la méthode Dispose, cette méthode comes from the Control classe de base

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

Si RestartForm étend System.Windows.Forms.Form, vous devriez être en mesure de passer outre Dispose (bool disposition). Vous devriez correctement implémenter ceci pour votre classe "RestartForm" pour disposer de vos IDisposables.

Il devrait ressembler à:

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

J'utilise cette méthode :)

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