Je suis sûr que je suis tout simplement pas comprendre quelque chose fondamentale sur les événements et/ou des délégués en C#, mais pourquoi je ne peux pas faire les tests booléennes dans cet exemple de code:En C#, pourquoi ne puis-je pas tester si un gestionnaire d'événement est nul en dehors de la classe qu'il a définie?
public class UseSomeEventBase {
public delegate void SomeEventHandler(object sender, EventArgs e);
public event SomeEventHandler SomeEvent;
protected void OnSomeEvent(EventArgs e) {
// CANONICAL WAY TO TEST EVENT. OF COURSE, THIS WORKS.
if (SomeEvent != null) SomeEvent(this, e);
}
}
public class UseSomeEvent : UseSomeEventBase {
public bool IsSomeEventHandlerNull() {
// "LEFT HAND SIDE" COMPILER ERROR
return SomeEvent == null;
}
}
class Program {
static void Main(string[] args) {
var useSomeEvent = new UseSomeEvent();
useSomeEvent.SomeEvent +=new UseSomeEventBase.SomeEventHandler(FuncToHandle);
// "LEFT HAND SIDE" COMPILER ERROR
if (useSomeEvent.SomeEvent == null) {
}
var useSomeEventBase = new UseSomeEventBase();
useSomeEventBase.SomeEvent += new UseSomeEventBase.SomeEventHandler(FuncToHandle);
// "LEFT HAND SIDE" COMPILER ERROR
if (useSomeEventBase.SomeEvent == null) {
}
}
static void FuncToHandle(object sender, EventArgs e) { }
}
+1 pour la réponse. Juste pour y ajouter, vous pouvez, bien sûr, implémenter les opérations add/remove en tant que méthodes explicites avec un délégué multi-cast en interne. Dans ce cas, vous pouvez suivre vous-même les abonnés et les non abonnés et ainsi donner accès à des informations supplémentaires (par exemple, le nombre d'abonnés, etc.) - si vous le souhaitez. – LBushkin
Yup - va ajouter cela, merci. –
Il peut être utile de noter que les événements * raison * sont implémentés de cette façon afin que toute classe ne puisse pas changer le comportement de la classe avec l'événement simplement en accédant à l'événement (comme une propriété delegate) et en l'effaçant liste des abonnés. – womp