IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

[C#]Analyse de code -> warning CA2000


Sujet :

C#

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2008
    Messages : 612
    Points : 1 050
    Points
    1 050
    Par défaut [C#]Analyse de code -> warning CA2000
    Bonjour,

    Je viens d'installer VS2010 version trial, pour me faire une idée et surtout parce que des fonctionnalités de C#4 m'intéressent.

    Je migre un code en cours de développement qui fonctionne.

    Par curiosité, je lance l'analyse de code, et j'obtiens pour plusieurs blocs de code un warning CA2000.

    Par exemple, pour le bloc qui suit, j'obtiens :

    Avertissement 2 CA2000 : Microsoft.Reliability : Dans la méthode 'MdiMain.MdiMain()', l'objet 'item' n'a pas été supprimé dans tous les chemins d'accès d'exception. Appelez System.IDisposable.Dispose sur l'objet 'item' avant que toutes les références s'y rapportant ne soient hors de portée. D:\Visual_Studio\C#\Domogest\Domogest\MdiMain.cs 153 Domogest
    Je comprends parfaitement ce que ça veut dire, mais l'ennui est que le bloc concerné est ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
               // Pour chaque valeur de langue listée dans l'Enum Langages
                foreach (Langages langue in Enum.GetValues(typeof(Langages)))
                {
                    // construire un item basé sur le nom correspondant à la valeur et lui affecter un événement
                    var item = new ToolStripMenuItem( Enum.GetName(typeof(Langages),langue), null, new EventHandler(tsmiLangage_Click));
                    // Cocher si correspond aux préférences actuelles
                    item.Checked = langue == Langue;
                    // Tag = valeur -> facilite le traitement dans le menu
                    item.Tag = langue;
                    // Placer l'item dans Préférences->Langages
                    tsmiLangue.DropDownItems.Add(item);
                }
    Et bien entendu, si j'ajoute un

    après le .add(item), ben évidemment je détruis l'item de menu que je viens de créer, et donc je n'ai plus aucun item créé en sortie de la boucle.

    Or, la msdn m'indique que je dois absolument utiliser un dispose :

    Ne supprimez pas d'avertissement de cette règle, à moins que vous ayez appelé une méthode sur votre objet qui appelle Dispose, tel que Close.
    Ai-je raté quelque chose, est-ce que ma façon de procéder est incorrecte, ou est-ce l'analyseur de code qui est un peu "fantaisiste"?

    Merci d'avance
    Claude

  2. #2
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Pour être clean, il faudrait try catcher ton code avant la .Add, et Disposer ton objet dans le catch. Je suppose que du coup la règle déterminera correctement que dans le seul chemin où la lclasse n'est pas disposée, c'est à dire quand aucune exception n'est levée, une référence à ton objet a été ajoutée.

    Ca supposerait que la règle arrive à savoir que Add finit par créer une référence d'un objet vivant (ici ton MdiMain) vers l'objet disposable, chose qu'il me semble bien difficile de déterminer...

    Tu peux essayer de réorganiser ton code et faire le Add en tout premier ? Un truc du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    var item = new ToolStripMenuItem(...);
    try
    {
        tsmiLangue.DropDownItems.Add(item);
    }
    catch
    {
        item.Dispose();
        item = null;
    }
    // là, on est sûrs que tout s'est bien passé :
    // on a soit une référence, soit l'objet est disposé
    if (item != null)
    {
        item.Checked = langue == Langue;
        item.Tag = langue;
    }
    ಠ_ಠ

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2008
    Messages : 612
    Points : 1 050
    Points
    1 050
    Par défaut
    Je suppose que du coup la règle déterminera correctement que dans le seul chemin où la lclasse n'est pas disposée, c'est à dire quand aucune exception n'est levée, une référence à ton objet a été ajoutée.
    J'ai essayé et ça ne change rien, j'ai toujours strictement le même warning.

    Ca supposerait que la règle arrive à savoir que Add finit par créer une référence d'un objet vivant (ici ton MdiMain) vers l'objet disposable, chose qu'il me semble bien difficile de déterminer..
    Je peux donc présumer que mon code est correct et que c'est l'analyseur de code qui est un peu susceptible?

    merci,
    Claude

Discussions similaires

  1. Outil d'analyse de code
    Par Bloon dans le forum Outils
    Réponses: 8
    Dernier message: 07/08/2007, 09h04
  2. Analyse de code
    Par ecocentric dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 11/02/2005, 01h09
  3. [WSAD 5 ] - Analyse de code
    Par nicoswiss dans le forum Eclipse Java
    Réponses: 8
    Dernier message: 13/08/2004, 10h21
  4. [ Code ] Analyse de code - Attribut Inutile
    Par geegee dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 19/05/2004, 09h07
  5. Cherche lien info... sur l'analyse du code
    Par Alec6 dans le forum Qualimétrie
    Réponses: 3
    Dernier message: 03/03/2004, 14h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo