JHa*_*ey1 3 c# events user-interface event-handling
下午好,
我有一些关于GUI事件处理的基本问题.首先使用C#,我们如何将事件链接到对象 - 我猜测事件处理程序?如果是这样,每个处理程序可以使用单独 - 事件处理程序如何定位它必须操作的对象?
我对JAVA中的工作原理有一个大概的了解.指向我的参考将是好的 - 我已经搜索谷歌的答案无济于事.
非常感谢,J
首先使用C#,我们如何将事件链接到对象 - 我猜测事件处理程序?如果是这样,每个处理程序可以使用单独
是的,每个事件处理程序都有自己的代码:
class A {
public event EventHandler SomeEvent;
}
class B {
public B(A a) {
a.SomeEvent += (sender, e) => { Console.WriteLine("B's handler"); };
}
}
class C {
public C(A a) {
a.SomeEvent += (sender, e) => { Console.WriteLine("C's handler"); };
}
}
Run Code Online (Sandbox Code Playgroud)
事件处理程序如何定位它必须操作的对象?
我将过多地简化这一点,但事件处理程序本质上是围绕观察者模式的包装器.与任何其他Delegate类型一样的EventHandlers在方法调用列表中保存订阅者列表(请参阅Delegate.GetInvocationList).你可以这样想:
class EventHandler {
LinkedList<Action<object, EventArgs>> subscribers =
new LinkedList<Action<object, EventArgs>>();
public void Add(Action<object, EventArgs> f) {
subscribers.AddLast(f);
}
public void Remove(Action<object, EventArgs> f) {
subscribers.Remove(f);
}
public void Invoke(object sender, EventArgs e) {
foreach(Action<object, EventArgs> f in subscribers)
f(sender, e);
}
}
Run Code Online (Sandbox Code Playgroud)
(上面的代码与真实事件处理程序类的实际实现细节相去甚远.委托类型是不可变的,因此添加一个处理程序返回一个新的Delegate,添加了处理程序而不是改变处理程序.我相信他们的Add /删除方法也有很多线程伏都教.)
由于委托实例拥有对每个订阅者的引用,因此它可以直接访问它操作的任何对象.