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 :

Créer un règle dans FXCop pour vérifier l'utilisation de la méthode Dispose


Sujet :

C#

  1. #1
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 506
    Points
    9 506
    Par défaut Créer un règle dans FXCop pour vérifier l'utilisation de la méthode Dispose
    Salut,

    On néglige souvent de détruire les objets que l'on créé en se disant que le garbage collector se débrouillera bien tout seul.

    Cependant, ce n'est pas toujours le cas ou alors on essaye d'utiliser des objets dont on pense qu'on peut encore disposer.

    Je voudrais donc créer une règle dans FXCop afin de vérifier que tous les types qui présentent une méthode "Dispose" sont utilisés dans un "using".

    J'ai repris le code de cet article qui analyse les membres d'une classe.
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    using System;
    using System.Collections.Generic;
    using System.Text;
    using Microsoft.FxCop.Sdk;
    using System.Collections;
     
     
    namespace Immobilis.Fundamentals.CustomRules
    {
        public abstract class BaseCustomRule : BaseIntrospectionRule
        {
            protected BaseCustomRule(string ruleName)
                : base(ruleName, "ImmobilisCustomRules.Rules", typeof(BaseCustomRule).Assembly)
            {
     
            }
        }
     
        public class Rule1 : BaseCustomRule
        {
            public Rule1()
                : base("ImmobilisRule1")
            { }
     
            public override void BeforeAnalysis()
            {
                base.BeforeAnalysis();
            }
     
            public override ProblemCollection Check(Member member)
            {
                if (member == null)
                    return null;
     
                if (member.ToString().StartsWith("toto"))
                    Problems.Add(new Problem(GetResolution(member.Name.ToString())));
     
                return Problems;
            }
     
            public override void AfterAnalysis()
            {
                base.AfterAnalysis();
            }
        }
     
    }
    Plutôt qu'un membre, j'imagine qu'il faut vérifier un "Type". Si ce type présente une méthode (un membre) Dispose, ou bien implémente l'interface IDisposable, alors il faut vérifier qu'il se trouve dans un using.

    C'est bien dit comme ça, mais je ne sais pas trop comment faire.

    Quelqu'un aurait-il une idée?

    Merci

    A+

  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
    Je connais pas assez FxCop pour répondre à ta question ; mais je doute fort de sa pertinence. Pourquoi voudrais tu forcément utiliser un objet implémentant IDisposable dans un bloc using ? Si dans tous les scénarios on pouvait libérer la ressource dans la même fonction que là où on l'a prise, ça serait trop facile

    Typiquement : une form crée des tas de contrôles, qu'elle a en variables membres ; dans son Dispose, elle dispose ces contrôles. C'est elle qui a la main dessus.

  3. #3
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 506
    Points
    9 506
    Par défaut
    Salut,

    Mon experience se base sur de l'ASP.NET. Il est interessant de considérer l'utilisation du using dans un winform. MAis en l'occurence, il s'agit d'une couche métier indépendante de l'interface (Win/Webform, console, ...).

    De plus, en ASP net les objets n'ont pas trop d'existance après le chargement de la page.

    Dans le cas concret de l'utilisation des connections, j'ai pu remarquer que le code etait bcp plus stable quand on utilise des blocs using.

    En effet, afin de limiter le nombre de connections par secondes ou utilisateur, on créé parfois des connections en variables privées de la classe (dans le pire des cas) ou dans une méthode. Cela sous entend qu'on essaye de réutiliser le même objet de connection pour plusieurs tâches. Or cela pose pb quand on ouvre un datareader qui monopolise la connexion pendant toute la lecture.

    Le systeme sur lequel je travaille est très consommateur de connections. En utilisant des blocs using on ne laisse rien trainer derrière soit.

    Dans le cas des dataset par exemple, si le dataset est volumineux on peut s'assurer que la ressource sera exploitée seulement pour le bloc de code qui en a besoin.

    A+

  4. #4
    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
    Je comprends bien ce que tu veux dire

    Je sais pas si t'as fait du C++, mais on on peut créer des objets de deux façon : sur la pile ou sur le tas. dans le premier cas, un objet et automatiquement détruit quand on sort de sa portée ; dans l'autre, il ne l'est que si on le demande explicitement, avec "delete".

    La syntaxe "using" de C# reprend ce premier comportement de C++. Ce que je veux te dire, c'est que faire une règle qui renvoie un warning quand on ne Dipose pas tout de suite un objet est violent, puisque cela condamne des codes parfaitement légitimes.

    Après, je ne sais pas si FxCop est fait pour rester "générique" ou s'il est pensé pour ajouter des règles de bonnes pratiques réservées à un projet donné.

    'fin je réponds pas à ta question, désolé

  5. #5
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 506
    Points
    9 506
    Par défaut
    FXCop verifie du code et le soumet aux bonnes pratiques reconnues par Microsoft (pas de débat là-dessus) pour le developpement d'application .NET.

    Il y a beaucoup de règles. Certaines plus ou moins difficiles à comprendre car ce sont des aspects de la programmation qu'on ne prend pas souvent en compte il me semble.

    Il me semble d'ailleurs qu'on programme souvent au fil de l'eau (pas de débats là-dessus non plus). FXCop pour moi présente l'avantage de poser des questions et des règles (ce qui manque souvent).
    un objet est automatiquement détruit quand on sort de sa portée
    Plutôt quand il n'est plus référencé (pareil au même?). le using impose que les éléments du code déclarés dans le block ne sont pas utilisables en dehors et que la méthode dispose sera appelée à la fin du block. Cela me semble tout à fait logique dans la mesure où à la fin du block la ressource ne sera/devra plus être référencée.
    puisque cela condamne des codes parfaitement légitimes
    Du genre?
    fin je réponds pas à ta question
    Pas de soucis, c'est interessant
    Tu devrais essayer et me dire ce que tu en penses.

  6. #6
    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
    Citation Envoyé par Immobilis Voir le message
    Plutôt quand il n'est plus référencé (pareil au même?)
    je maintiens : en C++, un objet déclaré sur la pile est détruit (destructeur + free mémoire) quand on sort du bloc où il est déclaré.

    Citation Envoyé par Immobilis Voir le message
    Du genre?
    Beh les Winforms. Une Form est IDisposable ; elle contient des tas d'objets qui le sont aussi (boutons, labels, etc.) qui le sont aussi car ils possèdent des ressources systèmes (handles, etc.)

    La form, a sa création, crée les contrôles qu'elle contient ; à sa "Disposition", elle les dispose aussi. Tu vois bien que ce n'est pas dans la même méthode que les boutons sont créés et détruits, un bloc using n'est pas adapté.

Discussions similaires

  1. Créer une règle dans Outlook
    Par nanoo79 dans le forum Outlook
    Réponses: 1
    Dernier message: 08/12/2014, 17h01
  2. Comment créer une règle dans Sonar
    Par catmary dans le forum Intégration Continue
    Réponses: 7
    Dernier message: 09/07/2014, 09h34
  3. Réponses: 3
    Dernier message: 03/10/2009, 22h51
  4. Réponses: 3
    Dernier message: 01/01/2007, 21h17
  5. Réponses: 2
    Dernier message: 07/07/2006, 10h00

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