Evenements : interet du mot clé Event ?? [Résolu]

olivgiov 11 Messages postés samedi 7 octobre 2006Date d'inscription 2 avril 2007 Dernière intervention - 26 nov. 2006 à 15:41 - Dernière réponse : cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention
- 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
Afficher la suite 

Votre réponse

7 réponses

Meilleure réponse
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 26 nov. 2006 à 19:21
3
Merci
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
*/

Merci cs_coq 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 92 internautes ce mois-ci

Commenter la réponse de cs_coq
taupe4 94 Messages postés dimanche 16 avril 2006Date d'inscription 17 avril 2008 Dernière intervention - 26 nov. 2006 à 18:13
0
Merci
essaie de sortir le delegate de class Tableau ;)

et il faut faire x.OnAssign += new delegCreation(r1.recept); pour assigner un évènement :)
Enjoy
Commenter la réponse de taupe4
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 26 nov. 2006 à 20:26
0
Merci
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
*/
Commenter la réponse de cs_coq
taupe4 94 Messages postés dimanche 16 avril 2006Date d'inscription 17 avril 2008 Dernière intervention - 27 nov. 2006 à 00:13
0
Merci
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
Commenter la réponse de taupe4
olivgiov 11 Messages postés samedi 7 octobre 2006Date d'inscription 2 avril 2007 Dernière intervention - 27 nov. 2006 à 10:18
0
Merci
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


 
Commenter la réponse de olivgiov
olivgiov 11 Messages postés samedi 7 octobre 2006Date d'inscription 2 avril 2007 Dernière intervention - 27 nov. 2006 à 14:11
0
Merci
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 ?
Commenter la réponse de olivgiov
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 27 nov. 2006 à 18:58
0
Merci
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
*/
Commenter la réponse de cs_coq

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.