Cela semble fou, mais j'ai créé un événement dans la classe et j'ai essayé de l'élever sans que personne ne s'enregistre. Cependant, cela donnerait une exception. Est-il nécessaire que quelqu'un s'enregistre avant de soulever l'exception? Si oui, quels sont les travaux?Est-il nécessaire que quelqu'un soit inscrit à un événement avant de pouvoir le faire?
Répondre
oui, un événement auquel personne n'est inscrit est nul. La méthode standard des événements de tir est:
event EventHandler MyEvent;
private void FireMyEvent(EventArgs e) {
var handler = MyEvent;
if (handler != null)
handler(this, e);
}
Eric Lippert a écrit un fantastique article pourquoi ce modèle est la façon « correcte » des événements de tir
Vérifier null.
if (Object.Event != null) Object.Event();
HTH Alex
Dans .NET, les événements sont (par défaut) traitées comme délégués de multidiffusion. Cela signifie que tant que vous n'aurez pas affecté le premier gestionnaire d'événements à l'événement, la référence d'événement sera null
.
Cela a conduit à la manière typique d'élever un être de l'événement:
public event EventHandler Event;
protected virtual void OnEvent(EventArgs e)
{
EventHandler @event = Event; // Copy immutable delegate for thread safety.
if(@event != null) // Check for null.
@event(e); // Raise event.
}
Il est préférable de copier l'événement dans une variable temporaire pour éviter les conditions de course – thecoop
Si personne n'a souscrit à l'événement, l'objet événement est null
. Il est une pratique courante d'utiliser une méthode OnEvent
-comme, par exemple (en supposant que votre événement est appelé MyEvent
):
public event EventHandler<MyEventArgs> MyEvent;
void OnMyEvent(MyEventArgs args) {
if(MyEvent != null) MyEvent(this, args);
}
Lorsque vous devez soulever l'événement, vous appelez simplement la méthode OnMyEvent
.
La solution la plus simple à ce problème est de déclarer l'événement:
public event EventHandlerType MyEvent = delegate { };
En d'autres termes, ajouter = delegate { };
à la fin.
Vous n'avez plus besoin d'écrire une charge de courrier indésirable chaque fois que vous déclenchez l'événement.
Alors, pouvons-nous définir une référence d'événement à null ?? Si oui, il vaut mieux vérifier les valeurs nulles. –
Le code des autres classes ne peut pas attribuer une nouvelle valeur à un membre déclaré comme 'event'. Ils peuvent seulement utiliser '+ =' et '- ='. Ils ne peuvent pas supprimer le délégué vide. –
Oui. S'il n'y a aucun abonné, l'événement sera null et vous obtiendrez une exception NullReferenceException lorsque vous l'appelez. La bonne façon de faire le chèque est comme thecoop a dit, mais il y a un simple « raccourci »:
public event EventHandler Event = delegate {};
Cela provoque l'événement pour un abonné par défaut qui ne fait rien, et ne sera donc pas jeter une exception si il y a des abonnés. Il y a un légère surcharge de performance de de faire cela, mais cela supprime le besoin de vérifier les nulls.
voir ceci: http://stackoverflow.com/questions/170907/is-there-a-downside-to-adding-an-anonymous-empty-delegate-on-event-declaration pour les considérations de performance à utiliser des délégués vides. –
Juste pour ajouter, vous pouvez également utiliser des méthodes d'extension.
public static void RaiseSafe<T>(this EventHandler<T> eventHandler, object sender, T args)
where T : EventArgs
{
if (eventHandler != null)
eventHandler(sender, args);
}
Et l'utiliser comme ceci:
MyEvent.RaiseSafe(this,new EventArgs());
Dans ce cas, la variable temporaire est redondante, car le fait de passer le gestionnaire d'événements à la méthode élimine la condition de concurrence. La vérification null est toujours nécessaire cependant. –
Des acclamations intéressantes. –
- 1. Que devez-vous savoir avant de pouvoir obtenir un emploi Rails d'entrée de gamme?
- 2. Comment définir un global avant que le test de squelette de PHPUnit soit exécuté
- 3. C#: Notification avant que WeakReference ne soit collecté?
- 4. Vous devez cliquer deux fois sur le lien créé dynamiquement sur le contrôle avant de faire quoi que ce soit?
- 5. Jquery - Arrête de cliquer avant que le document ne soit prêt
- 6. ASP.NET MVC Ajax ActionLink OnComplete callback invoqué avant que le remplacement soit terminé?
- 7. C# Valider avant de quitter accept_button événement
- 8. Est-il nécessaire d'appeler ResolveUrl() avant LoadControl()?
- 9. Puis-je cibler un élément avant qu'il ne soit fermé?
- 10. Comment faire pour que le contenu d'une bordure à coins arrondis soit aussi arrondi?
- 11. Que dois-je faire dans un environnement de support avant le lancement de Daylight Savings?
- 12. Choses que je voudrais pouvoir faire en VIM lors de la programmation Ruby
- 13. Déclarer un objet avant même que cette classe ne soit créée
- 14. Java JTree valueChanged Événement avant MouseEvent
- 15. De quel événement aurais-je besoin pour pouvoir dire que la souris a été déplacée sur un JMenuItem?
- 16. Comment faire pour que la valeur de l'attribut de texte en sortie soit un lien hypertexte?
- 17. Puis-je spécifier un délai avant que le navigateur déclenche l'événement "rollover"?
- 18. Est-il encore nécessaire de mettre un espace avant de fermer un élément vide en XHTML?
- 19. Faire un événement lors de la saisie du texte
- 20. HOWTO: spécifiez-vous dans app.config pour appeler une fonction avant que Main() ne soit appelée?
- 21. Comment empêcher la soumission de formulaire avant que DOM soit prêt?
- 22. Problème de Chrome et JQuery - $ (document) .ready (function() {}); être appelé avant que la page soit chargée
- 23. Est-ce que c'est nécessaire?
- 24. Est-il nécessaire d'assigner une chaîne à une variable avant de la comparer à une autre?
- 25. Comment faire pour que le clip Canvas soit contenu dans Flex?
- 26. Comment charger une DLL dans FireFox xpi dans le répertoire du PC local avant que l'installation de l'extension soit terminée?
- 27. Javascript sur la page ne s'exécute pas avant que l'événement AJAX onComplete soit appelé
- 28. Comment faire pour que mon Pocket PC reste allumé jusqu'à ce que mon application soit terminée?
- 29. Comment faire pour que le format java.text.NumberFormat 0.0d soit "0" et non "+0"?
- 30. PHP: Comment tester le temps nécessaire pour faire une requête?
Thanx pour le lien. en fait une réponse complète. +1 –
du lien: Pourquoi la temp? La variable temporaire vérifie que la fonction est "thread-safe".Si les gestionnaires de l'événement sont en cours de modification sur un autre thread, il est possible que Foo soit non nul au point de vérification, puis défini sur null sur un thread différent, puis l'invocation se déclenche. –
ici temp est gestionnaire –