pour comprendre les différences, vous pouvez regarder ces 2 exemples
Exemple avec des délégués (Action dans ce cas qui est une sorte de délégué qui ne retourne pas de valeur)
public class Animal
{
public Action Run {get; set;}
public void RaiseEvent()
{
if (Run != null)
{
Run();
}
}
}
pour utiliser le délégué, vous devez faire quelque chose comme ça
Animale animal= new Animal();
animal.Run += () => Console.WriteLine("I'm running");
animal.Run += () => Console.WriteLine("I'm still running") ;
animal.RaiseEvent();
ce code fonctionne bien mais vous pourriez avoir quelques points faibles.
Par exemple si j'écris ceci
animal.Run += () => Console.WriteLine("I'm running");
animal.Run += () => Console.WriteLine("I'm still running");
animal.Run = () => Console.WriteLine("I'm sleeping") ;
avec la dernière ligne de code, j'avais remplacé les comportements précédents juste avec un manquant +
(j'ai utilisé à la +
place de +=
)
Un autre point faible est que chaque classe qui utilise votre Animal
classe peut se lever RaiseEvent
simplement en l'appelant animal.RaiseEvent()
.
Pour éviter ces points faibles, vous pouvez utiliser events
en c #.
Votre classe d'animaux changera de cette façon
public class ArgsSpecial :EventArgs
{
public ArgsSpecial (string val)
{
Operation=val;
}
public string Operation {get; set;}
}
public class Animal
{
public event EventHandler<ArgsSpecial> Run = delegate{} //empty delegate. In this way you are sure that value is always != null because no one outside of the class can change it
public void RaiseEvent()
{
Run(this, new ArgsSpecial("Run faster"));
}
}
pour appeler des événements
Animale animal= new Animal();
animal.Run += (sender, e) => Console.WriteLine("I'm running. My value is {0}", e.Operation);
animal.RaiseEvent();
Différences:
- Vous n'utilisez pas une propriété publique mais un champ public (avec des événements, le compilateur protège vos champs contre les accès indésirables)
- Les événements ne peuvent pas être attribués directement. Dans ce cas, vous ne pouvez pas faire l'erreur précédente que j'ai montrée en remplaçant le comportement.
- Personne en dehors de votre classe ne peut organiser l'événement.
- Les événements peuvent être inclus dans une déclaration d'interface, alors qu'un champ ne peut pas
Remarques
EventHandler est déclaré comme le délégué suivant:
public delegate void EventHandler (object sender, EventArgs e)
il prend un expéditeur (de type Object) et des arguments d'événement. L'expéditeur est nul s'il provient de méthodes statiques.
Vous pouvez également utiliser à la EventHAndler
place cet exemple qui utiliseEventHandler<ArgsSpecial>
référez-vous ici pour la documentation sur EventHandler