2008-12-20 11 views
4

Contexte

Dans Visual Studio 2008 Créer une nouvelle application Windows Forms, cela va créer un projet de squelette avec une classe appelée "Form1". VS2008 crée automatiquement une méthode Dispose().Winforms: Est-il sûr de supprimer le code dans la méthode Dispose() créé automatiquement créé par Visual Studio pour Windows Forms

/// <summary> 
    /// Clean up any resources being used. 
    /// </summary> 
    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> 
    protected override void Dispose(bool disposing) 
    { 
     if (disposing && (components != null)) 
     { 
      components.Dispose(); 
     } 
     base.Dispose(disposing); 
    } 

je me promenais dans un bureau de collègue de travail (un développeur senior) - bon gars, futé, de bonnes compétences en conception pour une conversation - mais je remarqué ce qu'il tape - comme il navigua le code de base, il a supprimé cette section du Dispose() les méthodes que VS2008 a créées pour les formulaires.

 if (disposing && (components != null)) 
     { 
      components.Dispose(); 
     } 

Alors, je lui ai demandé pourquoi et il a dit qu'il était pas nécessaire de le maintenir en.

Les questions

  • Est-il sûr de supprimer ce code?
  • Quels sont les avantages/inconvénients de le laisser ou de le retirer?

Répondre

5

Absolument ne supprimez pas s'il y a la moindre chance de vous jamais utiliser quelque chose comme un System.Windows.Forms.Timer sur la forme . Et il y a toujours la chance de cela.

C'est ce code qui va éliminer la minuterie lorsque le formulaire se ferme, et si vous ne disposez pas de la minuterie, elle continuera à fonctionner. J'ai repris plusieurs bits de code qui ont eu ce type de bug introduit (pré. NET 2.0 ce mécanisme ne fonctionnait pas si bien), et les problèmes de perf intermittents résultants causés par des temporisateurs fonctionnant longtemps après que les formulaires qu'ils devaient mettre à jour soient fermés peut être une vraie douleur.

Il n'y a aucun avantage réel à supprimer ceci - si aucun contrôle ne s'est ajouté à la liste des composants alors components.Dispose() sera trivial à exécuter. Si les contrôles ont ajouté à la liste, c'est parce qu'ils doivent être éliminés.

7

Non, il n'est pas prudent de supprimer ce code. Plusieurs composants dépendent de ce modèle pour être en mesure de libérer correctement les ressources non gérées qu'ils conservent. Si vous supprimez ce code, votre application fonctionnera probablement 95% du temps. Les 5% de cas apparaîtront comme des fuites de ressources, des fuites de mémoire potentielles, des bogues non déterministes, ... en général, difficiles à localiser les problèmes. La meilleure approche pour traiter une ressource jetable est de disposer de l'instant où vous ne l'utilisez plus. Suivre cette pratique vous épargnera de nombreux maux de tête sur la route. Supprimer ce code prend exactement l'approche inverse.

Ce message sur le SO contient une explication plus détaillée: When should I dispose my objects in .NET?