如何在C#中实际创建事件#
我是C#事件和代表的初学者。几个问题,如果你看看the URL I have used to learn about events将是有意义的。如何在C#中实际创建事件#
我可以有一个事件没有与它关联的委托吗?我发现的那些经典作品总是把它们放在一起。
例如,我不明白如何生成事件。我完全迷失了,我知道Tick被定义为一个事件,但Tick的事件描述是什么?我在哪里定义Tick的构成?
此外,Tick值是从哪里创建的。看起来,我所看到的所有示例都不会初始化事件,并且有类似的语句声明:在附加示例中,如果(Tick!= null),但它不是在初始化Tick的位置。我环顾四周,我无法找到任何答案。
在此先感谢您的帮助
没有,事件只是一个特殊用途的代表。没有代表的情况下不能举办活动(尽管您可以在没有活动的情况下派代表参加活动 - 详情请参阅delegates以了解更多信息)。
不太确定我在这里理解你的问题。该事件的描述将在文档中。单单查看代码,您只需知道在该对象上有一个名为Tick的事件,您可以将事件处理程序附加到该事件上。
当您将事件处理程序添加到Tick(这是您看到的
+=
行)时,它将变为非空值。这就是那些!= null
检查正在做的事情 - 确保某人已附加到事件上。
一个事件只是一个add方法和remove方法的组合,它们都采用相同委托类型的单个参数。事件对传入代理的作用完全取决于实现。
做在Add
处理接收到的事件委托的最常见的就是与先前添加的代表(如果有的话)Delegate.Combine
它,但也有一些其他的可能性,以及:
如果一个对象将支持多种事件,但许多实例的大部分都会有零个订户,可以将该代理添加到一个表中。许多WinForms事件都是这样做的。
如果想要允许订户使用逆变委托类型,可以将接收到的委托置于代理或委托持有对象的数组,List<>
链接列表中。
如果事件表示某些类型的对象会触发,但某个特定事件永远不会触发事件,则该事件可能会简单地放弃该委托。例如,考虑一个抽象的ObservableFoo
类,它带有一个抽象的变化通知事件,以及一个契约,它说任何时候该实例的属性都会改变它将调用所有传入的委托;从它派生的类可以接受订阅请求,但由于它永远不会改变,因此永远不必调用传入的委托(或者对它们做任何其他操作),并且可以简单地丢弃它们。
由于事件是一对将委托类型作为参数的方法,因此每个事件都必须“按定义”使用委托作为其参数类型。所有不平凡的事件必须以某种形式存储传入的委托。接受多个订阅的最常见方式是将它们组合成一个多播委托(我不喜欢这种设计,顺便说一句,但它是最常见的);可以采用其他方法,但是要使用传入代表的事件必须以某种方式存储它们。
顺便说一句,有两种方法可以在C#中声明一个事件:一个可以明确地提供添加/删除处理程序,在这种情况下,编译器将使用这些处理程序创建一个事件。也可以提供事件名称和委托类型,在这种情况下,编译器将创建一个具有指定名称和范围的事件,一个名称为的私有变量和适当的委托类型以及线程安全的添加/删除方法从指定的变量中添加或删除事件。表格eventName += something;
或eventName -= something;
的陈述将作为对“添加”或“删除”方法的调用来处理;该名称的所有其他用途将引用该代表。请注意,在C#的旧版本中,在类中使用eventName += something;
和eventName -= something;
将使用代理上的+=
和-=
操作进行处理,这些操作不是线程安全的,但是新版本已更改此行为。
@Tim:我想知道你是否带走了我的网址? – user1298925
看看这里http://www.akadia.com/services/dotnet_delegates_and_events.html – Ehsan
@ user1298925:不。他只是正确地格式化了你的问题。 –