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#的方法组转换特性允许我们给一个事件处理程序注册简单的名称。比如:
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 即隐式类型化。