[C#]C#学习笔记-委托,事件
2012-02-16 16:21
459 查看
C#学习笔记-委托,event
罗朝辉(http://www.cnblogs.com/kesalin/)
《C#与.NET高级程序设计》读书笔记
1,.NET委托(delegate)是一个类型安全的对象,指向可以以后调用的其他方法,委托是内置支持多路广播或异步方法调用的对象。委托类型包含3个重要的信息:它所调用的方法的名称,该方法的参数(可选),该方法的返回值(可选)。
2,当C#编译器处理委托类型时,它自动产生一个派生自System.MulticastDelegate的密封类。这个类及其基类System.Delegate一起为委托提供必要的基础设施,以维护以后将要调用方法的列表。该密封类中的Invoke()用于同步调用当前方法(后台自动被调用),而BeginInvoke()和EndInvoke()用于异步调用当前方法,这三个方法的参数与返回值基于委托的声明。
3,建议将委托成员变量定义为私有的,可以强制封装服务并提供类型安全。
4,协变(宽松委托)允许我们构建一个委托,能指向返回类及相关继承体系的方法。具体做法是把委托的返回对象显示强制转换为继承体系中某个类型。逆变(contravariance)允许我们创建一个委托,指向多个方法,方法的参数是存在传统继承关系的对象。
5,C#允许我们定义泛型委托类型。
6,为了简化构建自定义方法来为委托调用列表增加和删除方法,C#提供了event关键字。在编译器处理event关键字时,它会自动提供注册和注销方法以委托任何必要的成员变量。这些委托成员变量总是声明为私有的,因此不能通过从触发事件的对象直接访问它们。event只是语法糖,只是为了节省我们打字的时间。
定义一个事件分为两步:首先,定义一个委托;然后,通过C# event 关键字用相关委托声明这个事件。编译器事实上会将 event 关键字扩展为两个隐藏的公共方法,一个带 add_ 前缀,一个带 remove_ 前缀,前缀后面是C# event 的名称。
7,匿名方法中最后一个大括号必须以分号结束,否则,将产生一个编译错误。匿名方法不能访问定义方法的 ref 和 out 参数。
8,C#的方法组转换特性允许我们给一个事件处理程序注册简单的名称。比如:
我们也可以显式转换一个事件处理程序为其关联委托的一个实例。
9,Lambda 表达式(=>)可以应用于任何匿名方法可以应用的场合,它只是用更简单的方法来写匿名方法,彻底简化了对.NET委托类型的使用。其使用方式为:定义参数列表,“=>”标记紧随其后,然后就是表达式。比如:
Lambda表达式的参数既可以是显式类型化的也可以是隐式类型化的。上面的列子是显式类型化为 int,我们也可以省略 int 即隐式类型化。
罗朝辉(http://www.cnblogs.com/kesalin/)
《C#与.NET高级程序设计》读书笔记
1,.NET委托(delegate)是一个类型安全的对象,指向可以以后调用的其他方法,委托是内置支持多路广播或异步方法调用的对象。委托类型包含3个重要的信息:它所调用的方法的名称,该方法的参数(可选),该方法的返回值(可选)。
2,当C#编译器处理委托类型时,它自动产生一个派生自System.MulticastDelegate的密封类。这个类及其基类System.Delegate一起为委托提供必要的基础设施,以维护以后将要调用方法的列表。该密封类中的Invoke()用于同步调用当前方法(后台自动被调用),而BeginInvoke()和EndInvoke()用于异步调用当前方法,这三个方法的参数与返回值基于委托的声明。
3,建议将委托成员变量定义为私有的,可以强制封装服务并提供类型安全。
4,协变(宽松委托)允许我们构建一个委托,能指向返回类及相关继承体系的方法。具体做法是把委托的返回对象显示强制转换为继承体系中某个类型。逆变(contravariance)允许我们创建一个委托,指向多个方法,方法的参数是存在传统继承关系的对象。
5,C#允许我们定义泛型委托类型。
6,为了简化构建自定义方法来为委托调用列表增加和删除方法,C#提供了event关键字。在编译器处理event关键字时,它会自动提供注册和注销方法以委托任何必要的成员变量。这些委托成员变量总是声明为私有的,因此不能通过从触发事件的对象直接访问它们。event只是语法糖,只是为了节省我们打字的时间。
定义一个事件分为两步:首先,定义一个委托;然后,通过C# event 关键字用相关委托声明这个事件。编译器事实上会将 event 关键字扩展为两个隐藏的公共方法,一个带 add_ 前缀,一个带 remove_ 前缀,前缀后面是C# event 的名称。
7,匿名方法中最后一个大括号必须以分号结束,否则,将产生一个编译错误。匿名方法不能访问定义方法的 ref 和 out 参数。
8,C#的方法组转换特性允许我们给一个事件处理程序注册简单的名称。比如:
public delegate void MathMessage(string msg); public event MathMessage ComputationFinished;
我们也可以显式转换一个事件处理程序为其关联委托的一个实例。
9,Lambda 表达式(=>)可以应用于任何匿名方法可以应用的场合,它只是用更简单的方法来写匿名方法,彻底简化了对.NET委托类型的使用。其使用方式为:定义参数列表,“=>”标记紧随其后,然后就是表达式。比如:
List<int> evenNumbers = list.FindAll((int i) => ((i % 2) == 0));
Lambda表达式的参数既可以是显式类型化的也可以是隐式类型化的。上面的列子是显式类型化为 int,我们也可以省略 int 即隐式类型化。
相关文章推荐
- C#学习笔记--详解委托,事件与回调函数
- 【unity3d-C#学习笔记】C#中的委托和事件
- 学习笔记之---C#中的委托与事件
- [读书笔记]C#学习笔记二: 委托和事件的用法及不同.
- C#学习笔记19-委托和事件
- [读书笔记]C#学习笔记二: 委托和事件的用法及不同
- 《C#高级编程》学习笔记------C#中的事件和委托
- 学习笔记之---C#中的委托与事件
- C#事件 委托 学习笔记
- C#中的委托、事件学习笔记
- C#学习笔记(三)—–C#高级特性中的委托与事件(下)
- C#学习笔记之三:C#接口与事件委托
- C#委托与事件学习笔记
- C#学习笔记 委托和事件
- [读书笔记]C#学习笔记二: 委托和事件的用法及不同.
- C#学习笔记8——C# 中的委托和事件
- 《C#高级编程》学习笔记------C#中的委托和事件(续)
- 精通C#学习笔记之事件(一)使用委托的弊端
- C#与.NET4 高级程序设计-----委托、事件 学习笔记
- [学习笔记]c#中的委托、事件、Func、Predicate、Observer设计模式以及其他