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 :

EventHandler en mode generics


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 527
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 527
    Par défaut EventHandler en mode generics
    Bonsoir,

    Sur l'utilisation d'un EventHandler, StyleCop me dit que je devrais utiliser les generics pour plus d'efficacité mais je ne trouve pas la syntaxe pour le faire.

    Voilà mon code original:

    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
     
    public partial class Form2 : Form
    {
        public event TopInstantEventHandler OnTopInstant;
     
        public Form2()
        {
            InitializeComponent();
        }
     
        private void button1_Click(object sender, EventArgs e)
        {
            if (OnTopInstant != null)
            {
                OnTopInstant(this, new GenererTopInstantEventArgs(DateTime.Now));
            }
        }
    }
     
    public class GenererTopInstantEventArgs : EventArgs
    {
        public DateTime Instant { get; set; }
     
        public GenererTopInstantEventArgs(DateTime moment)
        {
            Instant = moment;
        }
    }
     
    public delegate void TopInstantEventHandler(object sender, GenererTopInstantEventArgs e);
    Voilà le message de StyleCop:

    Target : WindowsApplication1.TopInstantEventHandler (IntrospectionTargetType)
    Resolution : "Remove 'TopInstantEventHandler' and replace its
    usage with EventHandler<T>"
    Help : http://msdn2.microsoft.com/library/ms182178(VS.90).aspx (String)
    Category : Microsoft.Design (String)
    CheckId : CA1003 (String)
    RuleFile : Design Rules (String)
    Info : "Do not declare new delegates to be used as event handlers
    when targeting a version of the .NET Framework that
    supports generics. Use an instance EventHandler<T>
    instead."
    Problème: si j'écris

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public delegate void EventHandler<T>(object sender, GenererTopInstantEventArgs e);
    Le compilo ne trouve plus le type de handler TopInstantEventHandler.

    Quelqu'un aurti un petit exemple à me donner ? Ou une correction de mon code ?

    Merci d'avance

    Papy !

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Ce que StyleCop veut dire, c'est que tu n'as pas besoin de déclarer un delegate spécifique pour ton évènement, car sa signature correspond à la signature "standard" pour les évènements en .NET et il existe déjà un delegate générique pour ça. Il suffit que tu supprimes la déclaration du delegate TopInstantEventHandler et que tu remplaces partout TopInstantEventHandler par EventHandler<GenererTopInstantEventArgs>

    Par ailleurs, un petit conseil : essaie de respecter les conventions de nommage pour les évènements :
    - pas de préfixe "On" pour l'évènement lui-même
    - nom de l'évènement préfixé par "On" pour la méthode protégée qui déclenche l'évènement (si elle existe)
    - nom de l'évènement suivi de EventArgs pour les paramètres de l'évènement
    - nom de l'évènement suivi de EventHandler pour le delegate correspondant à ton évènement (mais apparemment StyleCop recommande le delegate générique, donc c'est inutile)

    Au final, je verrais mieux ton code comme ça :
    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
     
     
    public partial class Form2 : Form
    {
        public event TopInstantEventHandler TopInstant;
     
        public Form2()
        {
            InitializeComponent();
        }
     
        private void button1_Click(object sender, EventArgs e)
        {
            OnTopInstant(new TopInstantEventArgs(DateTime.Now);
        }
     
        // Les classes dérivées peuvent overrider cette méthode plutôt que de s'abonner à l'évènement
        protected virtual void OnTopInstant(TopInstantEventArgs e)
        {
            if (TopInstant != null)
            {
                TopInstant(this, e);
            }
        }
    }
     
    public class TopInstantEventArgs : EventArgs
    {
        public DateTime Instant { get; set; }
     
        public TopInstantEventArgs(DateTime moment)
        {
            Instant = moment;
        }
    }
     
    // à supprimer si tu veux suivre les recommandations de StyleCop
    public delegate void TopInstantEventHandler(object sender, TopInstantEventArgs e);

    Si tu suis les conventions, ton code sera plus facile à utiliser et à maintenir par d'autres développeurs, car ce sont les mêmes conventions utilisées dans tout le .NET Framework

  3. #3
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 527
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 527
    Par défaut
    Ok merci !

    Et donc, avec les generics, ça donnerait ça:

    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
     
    public partial class Form1 : Form
    {
     
        public event EventHandler<TopInstantEventArgs> TopInstant;
     
        public Form1()
        {
            InitializeComponent();
        }
     
        // Les classes dérivées peuvent overrider cette méthode plutôt que de s'abonner à l'évènement
        protected virtual void OnTopInstant(TopInstantEventArgs e)
        {
            if (TopInstant != null)
            {
                TopInstant(this, e);
            }
        }
     
        private void OnTopInstant(DateTime instant)
        {
            if (TopInstant != null)
            {
                TopInstant(e, new TopInstantEventArgs(instant));
            }
        }
     
    }
     
    public class TopInstantEventArgs : EventArgs
    {
        public DateTime Instant { get; set; }
     
        public TopInstantEventArgs(DateTime moment)
        {
            Instant = moment;
        }
    }

    Right ??

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    C'est ça !

  5. #5
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 527
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 527
    Par défaut
    J'ai eu du mal à comprendre l'utilisation des génerics quand je me suis lancé dans C#. Au début, je pensais que ça ne pouvait servir qu'à faire des listes d'objets différents réunis par des méthodes communes, un peu comme les interfaces. En fait, c'est bien plus utile que ça.

    Merci encore ...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Le grand mode d'emploi du forum, à lire si vous souhaitez tout savoir !
    Par Anomaly dans le forum Mode d'emploi & aide aux nouveaux
    Réponses: 2
    Dernier message: 03/06/2013, 17h36
  2. Réponses: 17
    Dernier message: 17/10/2002, 20h06
  3. [TP]mode vga
    Par mikoeur dans le forum Turbo Pascal
    Réponses: 3
    Dernier message: 05/07/2002, 23h42
  4. Editeur en mode console
    Par logramme dans le forum C
    Réponses: 5
    Dernier message: 11/06/2002, 13h23
  5. Passer en mode 800*600
    Par flavien tetart dans le forum Assembleur
    Réponses: 8
    Dernier message: 30/05/2002, 23h05

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