取消.NET事件的订阅者

4

我被问到一个关于事件的非常有趣的问题。我认为答案是否定的,但我很好奇是否有我不知道的方法。

在下面的代码示例中,我能否从引用类B或其方法X中删除订阅?

Class1 A = new Class1();
Class2 B = new Class2();

A.DoneIt += B.X;

这段代码是关于it技术的内容,意思是在没有访问类A(也不通过类A的反射)的情况下执行A.DoneIt -= B.X;


1
你的问题等同于询问能否在没有列表引用的情况下从列表中移除一个项目。 - Stilgar
@Stilgar:微软本可以以这样的方式定义事件机制,使得事件订阅者可以取消他们的订阅(例如,不使用MulticastDelegate,而是使用SubscriberList类型;它调用返回bool的函数并从列表中删除任何返回true的函数)。请注意,即使OneDelegate += AnotherDelegate不是线程安全的,SubscriberList也可以提供线程安全的订阅和取消订阅消息。 - supercat
1个回答

6

不可以,只有当您可以访问事件时才能取消订阅。

委托指向一个方法,该方法没有指针返回到事件。因此,取消订阅事件的唯一访问方式是通过定义事件的类型实例。

进一步阅读:事件和委托


你确定吗?例如,作为B类,你不能删除对自己事件的订阅引用吗? - devoured elysium
并不是B类在他的问题中具有该事件。 - George Duckett
哦,我明白了。我之前理解反了;-( - devoured elysium

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接