如何在C#中实际创建事件

本文关键字:创建 事件 | 更新日期: 2023-09-27 18:24:21

我是C#事件和代理的初学者。如果你看看我用来了解事件的URL,几乎没有什么问题是有意义的。

  1. 我是否可以在没有代理的情况下举办活动?我找到的前任总是把他们放在一起。

  2. 例如,我不明白事件是如何生成的。我完全迷路了,我知道Tick被定义为一个事件,但Tick的事件描述是什么?我在哪里定义Tick的构成?

  3. 此外,Tick值在哪里初始化。我看过的所有例子似乎都从未初始化过事件,并且有一个类似于语句的语句:在所附的例子中,如果(Tick!=null),但不清楚Tick在哪里初始化。我环顾四周,找不到任何答案
    提前感谢的帮助

如何在C#中实际创建事件

  1. 不,活动只是代表的特殊用途。您不能在没有委托的情况下举办活动(尽管您可以在没有事件的情况下进行委托-请阅读委托以了解更多信息)。

  2. 我不太确定我是否理解你的问题。该事件的描述将在文件中。单看代码,您就知道在该对象上有一个名为Tick的事件,您可以将事件处理程序附加到该对象

  3. 当您将事件处理程序添加到Tick(即您看到的+=行)时,它将变为非null。这就是那些!= null检查正在做的事情——确保某人已经附加到事件上。

事件只是add方法和remove方法的组合,这两种方法都采用相同委托类型的单个参数。事件对传入委托的处理完全取决于实现。

对于在Add处理程序中接收到的事件委托,最常见的做法是将其与之前添加的委托(如果有的话)一起Delegate.Combine,但也有其他一些可能性:

如果一个对象将支持多种类型的事件,但许多实例中的大多数都没有订阅者,则可以将委托添加到表中。许多WinForms事件都会执行此操作。

如果希望允许订阅者使用相反的委托类型,可以将接收到的委托放入委托或委托持有对象的数组List<>链表中。

如果该事件表示某些类型的对象会激发,但某个特定实例永远不会激发,则该事件可能会简单地丢弃委托。例如,考虑一个具有抽象更改通知事件的抽象ObservableFoo类,以及一个约定,该约定表示每当实例的属性发生更改时,它都将调用所有传入的委托;从中派生的ImmutableFoo类可以接受订阅请求,但由于它永远不会更改,因此它永远不必调用传入的委托(或对它们执行任何其他操作),并且可以简单地丢弃它们。

由于事件是一对将委托类型作为参数的方法,因此每个事件都必须"根据定义"使用委托作为其参数类型。所有非琐碎的事件都必须以某种形式存储传入的委托。接受多个订阅最常见的方法是将它们组合成多播委托(顺便说一句,我不喜欢这种设计,但它是最常见的);可以采用其他方法,但是要使用传入委托的事件必须以某种方式存储它们。

顺便说一句,在C#中有两种声明事件的方法:一种可以显式提供添加/删除处理程序,在这种情况下,编译器将使用这些处理程序创建事件。也可以只提供事件名称和委托类型,在这种情况下,编译器将创建具有指定名称和作用域的事件、具有相同名称和适当委托类型的私有变量,以及线程安全的添加/删除方法,这些方法将事件添加到所指示的变量中或从中删除。形式为eventName += something;eventName -= something;的语句将作为对"add"或"remove"方法的调用进行处理;该名称的所有其他用途都将引用该委托。请注意,在C#的旧版本中,类中eventName += something;eventName -= something;的使用将使用委托上的+=-=操作来处理,这些操作不是线程安全的,但新版本已经改变了这种行为。