黑马程序员 委托、方法、事件 总结

来源:互联网 发布:ubuntu安装 分区 编辑:程序博客网 时间:2024/06/15 05:00
---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------

1.什么是委托:委托是一种特殊的引用类型,它将方法也作为特殊的对象封装起来,从而将方法作为变量或参数进行传递。

2.定义使用: delegete void DualFunction(double x, double y); //定义了一个委托类型DualFuntion, //一般定义在类中
 DuualFunction fun1 = sub;  //把一个方法名赋给委托对象
 fun1(a, b);  //通过委托对象来调用指定方法
注意:要声明委托的的返回类型(如果没有返回类型则为void)和参数类型。
 封装方法时,该方法的参数列表和返回类型必须和委托保持一至。
过程:类型定义、对象创建和方法绑定、方法调用
可以声明委托数组,将委托对象放在数组中。
DualFunction[] funs = new DualFunction[]{add, sub, mul, div};

3.委托加减运算:
DualFunction fun1 = new DualFunction(mul);
DualFunction fun2 = new DualFunction(div);
DualFunction fun3 = fun1 + fun2; // funn3就可以连续调用fun1、fun2
参与加减运算的委托对象必须属于同一个委托类型,也就是说,参与合并或删除的方法的参数和返回类型必须保持一至。
通过委托对象进行方法调用,会引发程序异常。。。。
判断委托对象是否为空:
 if (fun != null)
    fun(2.5, 2);

4.传递委托对象:C#委托机制将方法视为特殊的对象,也可以作为方法的参数和返回值进行传递

5.Delegate的类型成员
fun1(2.5, 2);
fun1.DynamicInvoke(2.5, 2); //params object[]数组型参数, 传错了运行会发生错误。
Delegate类定义了两个静态方法Combine和Remove,等效于加减运算,参数和返回类型都是基类,使用时需要进行类型转换。下面两行代码的作用是一样的。
DunlFunction fun3 = fun1 + fun2;
DunlFunction fun3 = (DunlFunction)Delegate.Combine(fun1, fun2);

6.定义和调用匿名方法
DualFunction fun4 = delegate(double i, double j)
{
    Console.WriteLine("{0} + {1} = {2}", x, y, x + y);
};
fun4(x, y);
如果一个方法只通过委托进行调用,C#中可以不写该方法的定义,直接把参数列表和执行代码写在委托对象的创建表达式中,此时被封装的方法就叫作匿名方法(对应,常规定义的方法成员叫作命名方法)。
注意:1.不使用new关键字,2.dalegate关键字之后写参数列表和执行代码,3.参数列表类型和个数还是返回类型要委托定义保持一致,如果代码中不出现参数变量,那么参数列表还可以省略。

7.外部变量:匿名方法定义在另一个方法的执行代码中,因此匿名方法的参数名和变量名就可能和外部代码发生冲突。C#规定,匿名方法的参数名不能和已有的外部变量名相同;如果匿名方法体中的局部变量名相同,那么它们代表同一个变量,此时称外部变量被匿名方法所“捕获”。 也就是说,该变量在外部定义在匿名方法中就不能再定义了,匿名方法中变量名和外部一样了就代表一个东东。

8.事件处理:1.在发布类中定义一个委托,2.在订阅者中可以把该类的一个方法发送给传进来的发布类中的委托, 3.那么,在发布类中相应代码被执行后就会触发订阅类中的那个方法。
为了防止在订阅者中恶意删除其他对象的订阅,可以在事件发布时 委托定义中加上event关键字(委托类型前。这个委托就成了一个事件,事件也就是委托对象。)其他类型再使用该委托时,就只能将其放在复合赋值操作符“+=”“-=”的左则  注意:和一般委托成员不同,某个类型的事件只能由自身触发,不能在外部触发调用.                                        
=========================
**例子:行使的车辆要对交通信号作出反应,那么我们可以在交通信号灯(发布者)类中声明并定义委托,信号灯说你启动的方法交给我吧,由我来控制你是停车和启动, 在车辆(订阅者)类中定义一个方法,订阅者对象将其事件处理方法合并到发布者对象的委托成员上。发布者对象在特定的情况下激发委托操作,从而自动调用订阅者对象的委托处理方法。

9.微软说了,为了减少原型委托类型重复性的定义的工作,我给你定义一个EventHandler委托类型,你尽量使用。该委托的定义为:public delegate void EventHandler(object sender, EventArgs e); //sender表示引发事件的对象,e表示事件中包含的数据。

---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------