Si j'ai CLASSA qui possède un événement public, SOMEEVENT et CLASSC qui possède une méthode, addlistener, qui accepte une référence EventHandler, pourquoi ne peut-il pas classer avoir une ligne qui dit C.Addlistener (ref A.SomeEvent)? Si j'essaie d'obtenir une erreur de compilateur indiquant: "L'événement" Classa.SomeVevent "ne peut apparaître que sur le côté gauche de + = ou - = (sauf lorsqu'il est utilisé à partir de la section" P> Pourquoi Cette restriction existe-t-il? Et comment puis-je me contourner tout en restant assez proche de ma structure? P>
Je suis un nœud choisi; toute aide serait appréciée. Merci! P>
class ClassA { public event EventHandler SomeEvent; } ClassB{ public ClassB() { ClassA a = new ClassA(); ClassC c = new ClassC(); c.addListener(ref a.SomeEvent); //Compile error } } class ClassC { public void addListener(ref EventHandler handler) { handler += onEvent; } private void onEvent(object sender, EventArgs e) { //do stuff } }
3 Réponses :
Comment puis-je me contourner tout en restant raisonnablement proche de ma structure? p> blockQuote>
Utiliser
A.SomeEvent + = gestionnaire code> à la place. P>
Pourquoi cette restriction existe-t-elle? P> blockQuote>
Voir la réponse de Marc Gravell. P>
en dehors de la classe, vous strong> strong> a accès au Imaginez que vous puissiez faire ce que vous suggérez. Par exemple, supposons que vous vous abonnez à un bouton Cliquez et certains Autre code EM> utilisent cette information pour vous accrocher à un événement «Cocher» - votre code ne fonctionnera pas comme prévu. Bug. P> Pour expliquer; Un événement n'est pas strud> un RE VOTRE SCIENario, que ce soit Ajouter code> et
Supprimer code> Accesseurs - c'est le point em > d'un événement, vous ne pouvez ni voir em> d'autres abonnés, ni les modifier (par exemple, définir l'événement à NULL). Il serait préférable de gérer l'événement normalement et de faire quelle que soit les conséquences dont vous avez besoin.
EventHandler code>, de la même manière qu'une propriété
int code> - le Événement / propriété Définit Méthodes Accessor EM>. P>
onevent code> public et utilisez
A.SomeEvent + = C.onvant; code> ou avoir certains em> méthode similaire et utilisez une méthode anon: p>
+1 pour expliquer beaucoup mieux la première partie de sa question.
Le mot clé d'événement crée un accesseur d'un objet délégué privé. La même chose qu'une propriété le fait, il limite l'accès à un domaine privé. Votre extrait de code échoue avec un type d'erreur similaire lorsque vous utilisez une propriété au lieu d'un événement:
property int Property;
Salut Hans, Savez-vous si quelque chose change depuis alors? Existe-t-il un moyen de soulever des événements de l'extérieur de la classe où il est déclaré, soit en utilisant la réflexion?
Bonjour, NEWTANG, au risque de sonner comme si je vous garde, veuillez accepter une recommandation conviviale de lire le livre de Jon Skeet, "C # en profondeur": Pour moi, le contenu des changements et des relations entre "événements et" délégués en C # Comme il a évolué à partir des premières versions à C # 3.0, au chapitre deux du livre, les choses les plus éclairées que j'ai lisées. Je dois admettre que je ne peux pas voir ce que votre "intention" est, exactement, dans ce code, mais ce n'est pas votre problème :) bonne chance,
@BILLW: Merci pour vos gentils mots - dans ce cas particulier, j'ai un article qui couvre une juste quantité de même terrain pour les événements et les délégués: POBOX.COM/~SKEET/CSHARP/EVENT.HTML - Pas besoin d'acheter le livre :)
Merci à tous pour les conseils et les articles. Il est clair que je devais lire des événements C # et les liens ont été très utiles.