1
16
您将创建四个事件和引发它们的方法,以及一个新的基于EventArgs的类来指示错误:
然后,类将使用方法或匿名函数订阅事件:
关于以上几点需要注意:
看到我 events/delegates 有关事件的更多详细信息。 |
2
5
您必须为此定义一个委托
ComputerEventArgs的定义如下:
触发事件的类将具有以下属性:
这是为事件分配处理程序的方式:
您的处理程序是:
|
3
4
|
4
2
首先,在.NET中有一个标准方法签名,通常用于事件。语言允许在事件中使用任何类型的方法签名,有些专家认为该约定有缺陷(我大多数同意),但它就是这样,我将在本例中遵循它。
public class ComputerEventArgs : EventArgs { Computer computer; // constructor, properties, etc. }
class ComputerEventGenerator // I picked a terrible name BTW. { public event EventHandler<ComputerEventArgs> ComputerStarted; public event EventHandler<ComputerEventArgs> ComputerStopped; public event EventHandler<ComputerEventArgs> ComputerReset; ... }
class ComputerEventGenerator { ... private void OnComputerStarted(Computer computer) { EventHandler<ComputerEventArgs> temp = ComputerStarted; if (temp != null) temp(this, new ComputerEventArgs(computer)); // replace "this" with null if the event is static } }
void OnLoad() { ComputerEventGenerator computerEventGenerator = new ComputerEventGenerator(); computerEventGenerator.ComputerStarted += new EventHandler<ComputerEventArgs>(ComputerEventGenerator_ComputerStarted); }
private void ComputerEventGenerator_ComputerStarted(object sender, ComputerEventArgs args) { if (args.Computer.Name == "HAL9000") ShutItDownNow(args.Computer); }
void OnClose() { ComputerEventGenerator.ComputerStarted -= ComputerEventGenerator_ComputerStarted; } 就这样! 编辑:我真的不明白为什么我的数字点都显示为“1”。我讨厌电脑。 |
5
1
做你想做的事有几种方法。这个 最直接 方法是为宿主类中的每个事件定义委托,例如
任何对象都可以通过以下方式“监听”此事件:
这样做的“推荐的标准方法”是定义EventArgs的子类来保存计算机(以及旧/新状态和异常)值,将4个委托减少到一个。在这种情况下,这将是一个更清洁的解决方案,特别是在以后扩展时,对计算机状态使用枚举。但是基本的技术还是一样的:
使用-=语法而不是+= |
6
1
在C中,事件是代表。它们的行为类似于C/C++中的函数指针,但它们是从Stase.委派派生的实际类。 在这种情况下,创建一个自定义的EventArgs类来传递计算机对象。
然后从生产者那里公开事件:
然后事件的使用者将处理程序函数绑定到使用者上的每个事件。
当ComputerEventProducer调用OnStarted时,将调用Started事件,该事件反过来将调用ComputerEventConsumer.ComputerStarted方法。 |
7
1
委托声明了一个函数签名,当它用作类上的事件时,它还充当已登记调用目标的集合。事件的+=和-=语法用于将目标添加到列表中。 鉴于以下委托用作事件:
您可以通过以下方式订阅这些事件:
尽管参数可以是任何东西,但对象发送者和事件参数e是一个非常一致使用的约定。启动的+=事件将首先创建指向目标方法的委托实例,然后将其添加到事件中。 在组件本身上,您通常会添加方法来激发事件:
如果没有向事件中添加委托,则必须测试是否为空。但是,当您进行方法调用时,将调用已添加的所有委托。这就是事件返回类型为void(没有单个返回值)的原因,因此为了反馈信息,您将拥有事件处理程序将更改的EventArgs的属性。 另一种改进是使用通用的EventHandler委托,而不是为每种类型的参数声明具体的委托。
|
8
0
非常感谢大家的回答!最后,我开始明白发生了什么。只有一件事;如果每个事件的参数数目/类型不同,我需要创建一个不同的::EventArgs类来处理它:
这需要三个类别来处理这些事件!?(两个自定义,一个使用默认的eventargs.empty类) 干杯! |
9
0
好的,最后澄清!:所以这几乎是我在实现这些事件时所能做的最明智的代码了?
|
Pikachu620 · 可以对事件列表进行排序吗? 2 年前 |
ManP22 · 我想在同一次单击中调用两个常量 2 年前 |
Pepe · 如何在JavaScript中的函数之间恢复/传递事件对象 2 年前 |