The relation between event and delegate in visual c#
2008-04-17 14:04
489 查看
事件是对象发送的消息,以发信号通知操作的发生。操作可能是由用户交互(例如鼠标单击)引起的,也可能是由某些其他的程序逻辑触发的。引发事件的对象称为事件发送方。捕获事件并对其作出响应的对象叫做事件接收方。
在事件通信中,事件发送方类不知道哪个对象或方法将接收到(处理)它引发的事件。所需要的是在源和接收方之间存在一个媒介(或类似指针的机制)。.NET Framework 定义了一个特殊的类型(Delegate),该类型提供函数指针的功能。
委托是可保存对方法的引用的类。与其他的类不同,委托类具有一个签名,并且它只能对与其签名匹配的方法进行引用。这样,委托就等效于一个类型安全函数指针或一个回调,而事件是委托的一种使用(事件的引发是通过调用委托实现的,而委托不仅仅可以用来实现事件的引发。 )。同时委托具有许多其他的用途。一个委托声明足以定义一个委托类。声明提供委托的签名,公共语言运行库提供实现。
与函数指针相比,delegate是面向对象、类型安全、可靠的受控(managed)对象。也就是说,runtime能够保证delegate指向一个有效的方法,你无须担心delegate会指向无效地址或者越界地址。
结合delegate的实现,我们可以将自定义事件的实现归结为以下几步:
1.定义delegate对象类型,它有两个参数,第一个参数是事件发送者对象,第二个参数是事件参数类对象。
2.定义事件参数类,此类应当从System.EventArgs类派生。如果事件不带参数,这一步可以省略。
3.定义事件处理方法,它应当与delegate对象具有相同的参数和返回值类型。
4.用event关键字定义事件对象,它同时也是一个delegate对象。
5.用+=操作符添加事件到事件队列中(-=操作符能够将事件从队列中删除)。
6.在需要触发事件的地方用调用delegate的方式写事件触发方法。一般来说,此方法应为protected访问限制,既不能以public方式调用,但可以被子类继承。名字是OnEventName。
7.在适当的地方调用事件触发方法触发事件。
参考资料:http://www.365tech.net/csharp/31433
/article/5567418.html
/article/5486436.html
在事件通信中,事件发送方类不知道哪个对象或方法将接收到(处理)它引发的事件。所需要的是在源和接收方之间存在一个媒介(或类似指针的机制)。.NET Framework 定义了一个特殊的类型(Delegate),该类型提供函数指针的功能。
委托是可保存对方法的引用的类。与其他的类不同,委托类具有一个签名,并且它只能对与其签名匹配的方法进行引用。这样,委托就等效于一个类型安全函数指针或一个回调,而事件是委托的一种使用(事件的引发是通过调用委托实现的,而委托不仅仅可以用来实现事件的引发。 )。同时委托具有许多其他的用途。一个委托声明足以定义一个委托类。声明提供委托的签名,公共语言运行库提供实现。
与函数指针相比,delegate是面向对象、类型安全、可靠的受控(managed)对象。也就是说,runtime能够保证delegate指向一个有效的方法,你无须担心delegate会指向无效地址或者越界地址。
结合delegate的实现,我们可以将自定义事件的实现归结为以下几步:
1.定义delegate对象类型,它有两个参数,第一个参数是事件发送者对象,第二个参数是事件参数类对象。
2.定义事件参数类,此类应当从System.EventArgs类派生。如果事件不带参数,这一步可以省略。
3.定义事件处理方法,它应当与delegate对象具有相同的参数和返回值类型。
4.用event关键字定义事件对象,它同时也是一个delegate对象。
5.用+=操作符添加事件到事件队列中(-=操作符能够将事件从队列中删除)。
6.在需要触发事件的地方用调用delegate的方式写事件触发方法。一般来说,此方法应为protected访问限制,既不能以public方式调用,但可以被子类继承。名字是OnEventName。
7.在适当的地方调用事件触发方法触发事件。
参考资料:http://www.365tech.net/csharp/31433
/article/5567418.html
/article/5486436.html
相关文章推荐
- How To Use the ODBC .NET Managed Provider in Visual C# .NET and Connection Strings
- The different between Char in C#.Net and in C++.Net(MFC)
- The Difference Between jQuery’s .bind(), .live(), and .delegate()
- The C# Memory Model in Theory and Practice
- The Difference Between @Helpers and @Functions In WebMatrix
- the difference between final and static in java
- In PHP5, what is the difference between using self and $this? When is each appropriate?
- The differences between pointer and reference in C++
- What is an intuitive explanation of the relation between PCA and SVD?
- what is the difference between "isempty"and "isnull"in the qt bool QString::isEmpty () const Retur.
- C# Delegates And Events in Depth[翻译加笔记]【Event】【2】
- FW:Use the OnReadyStateChange Property in Visual Basic and Visual C/C++
- What is the difference between getWidth/heigth() and getMeasuredWidth/Heigth() in Android SDK?
- How to know the corresponding relation between T-code and Program
- What are the practical differences between SVD and wavelet transforms in data analysis?
- The different between #define and const for a constant in C
- What are the differences between struct and class in C++?
- 171026 the order between idx and item in enumerate with python
- The difference between Delegate and Composite
- This project fills the absence of stdint.h and inttypes.h in Microsoft Visual Studio