Evenements : interet du mot clé Event ??

[Résolu]
Signaler
Messages postés
11
Date d'inscription
samedi 7 octobre 2006
Statut
Membre
Dernière intervention
2 avril 2007
-
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
-
Bonjour à tous !!

je suis nouveau venu dans le monde du C# et donc sur ce site.
j'ai cherché sur le forum mais j'ai pas trouvé de réponse à ma question.

Qu'elle est l'interet du mot clé event lors de la mise en place d'un evenement à l'aide de délégué ??


Voici un petit exemple où la suppression du mot clé event fonctionne



class






tableau

{


   public



string
[] tab;


   public



delegate



void



delegCreation
(

object
sender);


   public



event



delegCreation
OnAssign; // SI JE SUPPRIME EVENT CA FONCTIONNE PARFAITEMENT




   public
tableau()
   {
   tab =

new



string
[10];
   }


   public



string



this
[

int
x]
   {
   

set
      
{
      tab[x] =

value
;
      

if
(OnAssign !=

null
)
      

this
.OnAssign(

this
);
      }


    get
      
{   
      

return
tab[x];
      }
}

class
recepteur
{

int compteur;

public
void recept(
object x){
compteur++;
}

}

class
Program{

static
void Main(
string[] args){

recepteur r1 =
new
recepteur();

tableau x =
new
tableau();
x.OnAssign += r1.recept;
x[0] =
"salut";
x[1] =
"abc";
x[2] =
"ca va";

}}

Merci
Olivier

7 réponses

Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
97
Salut,

Pour l'assignation non c'est bon, C# 2.0 le permet. Mais j'ai tendance à trouver ça moins lisible que la forme standard.

Pour citer quelques intérêts de l'event :

- il ne peut être invoqué que par le code de la classe qui le contient, le delegate peut être invoqué par n'importe quel code y accédant, ce qui peut poser des problèmes

- en mode design, je ne crois pas que pour un composant graphique un delegate apparaisse dans la liste des évènement du PropertyGrid (je ne sais pas non plus du coup ce que ça donne en VB.NET)

- un event peut être défini dans une interface, pas le delegate vu qu'il s'agit d'un champs

- sur un event on peut redéfinir add/remove, utile pour ajouter des fonctionnalités de log par exemple, ou tout simplement effectuer une action nécessaire.
public event delegCreation OnAssign
{
    add
    {
        // ajouter du code ici
        OnAssign += value;
    }


    remove
    {
        // ajouter du code ici
        OnAssign -= value;
    }
}

- comme le dit taupe4, tu ne peux sortir la déclaration de delegCreation de la classe, ce serait bête de redéclarer à tout bout de champs des delegate ayant la même signature. Exemple : EventHandler dans le Framework .NET.

Après il doit y avoir encore pas mal d'autres différences en profondeur que je n'ai pas en tête là.

/*
coq
MVP Visual C#
CoqBlog
*/
Messages postés
91
Date d'inscription
dimanche 16 avril 2006
Statut
Membre
Dernière intervention
17 avril 2008
1
essaie de sortir le delegate de class Tableau ;)

et il faut faire x.OnAssign += new delegCreation(r1.recept); pour assigner un évènement :)
Enjoy
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
97
Euh en fait comme tout le monde l'aura compris cette phrase là est une annerie :p (non non, je ne boit pas -_-) :
"ce serait bête de redéclarer à tout bout de champs des delegate ayant la même signature. Exemple : EventHandler dans le Framework .NET."

Du coup, taupe4, qu'est ce que tu entendais pas "essaie de sortir le delegate de class Tableau ;)" ?

Sinon j'ai aussi fait une légère erreur sur le code ci dessus, il devrait plutôt être ainsi :

private delegCreation _onAssign;



public event delegCreation OnAssign
{
    add
    {
        // ajouter du code ici
        this._onAssign += value;
    }



    remove
    {
        // ajouter du code ici
        this._onAssign -= value;
    }
}




/*
coq
MVP Visual C#
CoqBlog
*/
Messages postés
91
Date d'inscription
dimanche 16 avril 2006
Statut
Membre
Dernière intervention
17 avril 2008
1
Dans les codes que j'ai vu, les delegates étaient à même le namespace, afin que plusieurs events utilisant ce delegate (par exemples les EventHandler) le fassent sans avoir à redéclarer les delegates ;)

public delegate void delegCreation(object sender);
class Tableau{
private delegCreation _onAssign;public event delegCreation OnAssign
{
    add
    {
        // ajouter du code ici
        this._onAssign += value;
    }

remove{

// ajouter du code ici

        this._onAssign -= value;
    }
}
}

class Exemple2{
    public event delegCreation OnDataChanged;
}

Enjoy
Messages postés
11
Date d'inscription
samedi 7 octobre 2006
Statut
Membre
Dernière intervention
2 avril 2007

Merci pour vos réponse rapide.

vous dîtes:
"- comme le dit taupe4, tu ne peux sortir la déclaration de delegCreation de la classe, ce serait bête de redéclarer à tout bout de champs des delegate ayant la même signature. Exemple : EventHandler dans le Framework .NET."

Serait-il possible d'avoir un exemple où l'on sortirait delegcreation de la classe où ca ne fonctionnerait pas avec Event et où ça fonctionnerait uniquement avec un delegate sans event ?


Que veux tu dire par "redéclarer à tout bout de champs des delegate ..." ?


Merci
Oliv


 
Messages postés
11
Date d'inscription
samedi 7 octobre 2006
Statut
Membre
Dernière intervention
2 avril 2007

Pour l'histoire de sortir le delegate j'ai compris je pense.

En effet , sans mot clé event

staticvoid Main(string[] args)
{

recepteur r1 = newrecepteur();
tableau x = newtableau();
x.OnAssign += r1.recept;
x[0] = "salut";
x[1] = "abc";
x[2] = "ca va";
x.OnAssign(x);

}

ce code fonctionne... mais si j'ajoute event ... j'ai un message d'erreur.

Remarquez , ca peut être interessant de ne pas mettre event si on veut simuler/forcer un evenement ,  non ?
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
97
Si tu as besoin de simuler / forcer un event c'est que tu as mit du code dans la méthode associée qui aurait dû se trouver dans une autre méthode, accessible quand à elle.

L'event est là pour permettre de notifier quelquechose au monde extérieur, pas pour être déclenché depuis celui ci.

/*
coq
MVP Visual C#
CoqBlog
*/