Evenements : interet du mot clé Event ??

Résolu
olivgiov Messages postés 11 Date d'inscription samedi 7 octobre 2006 Statut Membre Dernière intervention 2 avril 2007 - 26 nov. 2006 à 15:41
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 - 27 nov. 2006 à 18:58
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

cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
26 nov. 2006 à 19:21
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
*/
3
taupe4 Messages postés 91 Date d'inscription dimanche 16 avril 2006 Statut Membre Dernière intervention 17 avril 2008 1
26 nov. 2006 à 18:13
essaie de sortir le delegate de class Tableau ;)

et il faut faire x.OnAssign += new delegCreation(r1.recept); pour assigner un évènement :)
Enjoy
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
26 nov. 2006 à 20:26
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
*/
0
taupe4 Messages postés 91 Date d'inscription dimanche 16 avril 2006 Statut Membre Dernière intervention 17 avril 2008 1
27 nov. 2006 à 00:13
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
olivgiov Messages postés 11 Date d'inscription samedi 7 octobre 2006 Statut Membre Dernière intervention 2 avril 2007
27 nov. 2006 à 10:18
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


 
0
olivgiov Messages postés 11 Date d'inscription samedi 7 octobre 2006 Statut Membre Dernière intervention 2 avril 2007
27 nov. 2006 à 14:11
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 ?
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
27 nov. 2006 à 18:58
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
*/
0
Rejoignez-nous