gpt4 book ai didi

c# - 基本 GUI 事件处理问题 C#

转载 作者:行者123 更新时间:2023-11-30 13:24:26 25 4
gpt4 key购买 nike

下午好,

我有一些关于 GUI 事件处理的非常基本的问题。首先,使用 C# 我们如何将事件链接到对象——我猜是事件处理程序?如果可以,每个处理程序可以使用单独的代码吗? - 事件处理程序如何定位它必须操作的对象?

我对它在 JAVA 中的工作原理有一个大概的了解。将我指向引用就可以了——我已经在谷歌上搜索了无济于事的答案。

非常感谢,J

最佳答案

Firstly with C# how can we link events to objects - I am guessing event handlers? If so can each handler use separate code?

是的,每个事件处理程序都可以有自己的代码:

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"); };
}
}

How can the event handler locate the objects it must manipulate?

我打算将其过度简化,但事件处理程序本质上是观察者模式的包装器。与任何其他委托(delegate)类型一样,事件处理程序在方法调用列表中保存订阅者列表(参见 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);
}
}

(上面的代码与真实事件处理程序类的实际实现细节相去甚远。委托(delegate)类型是不可变的,因此添加处理程序会返回一个添加了处理程序的新委托(delegate),而不是就地改变处理程序。我相信他们的添加/删除方法中也有很多线程巫术。)

由于委托(delegate)实例持有对其每个订阅者的引用,因此它可以直接访问它操作的任何对象。

关于c# - 基本 GUI 事件处理问题 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4500500/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com