1、单元4 C#进阶编程 知识目标 v(1)掌握结构化的异常处理机制;v(2)深刻理解委托和事件;v(3)掌握枚举和结构;v(4)掌握字符串的常用方法;v(5)掌握正则表达式的基本用法;v(6)掌握常用的集合类和泛型集合类。能力目标v(1)能够捕获并处理异常;v(2)能使用枚举或结构描述数据;v(3)能对文本进行较为复杂的处理;v(4)能使用正则表达式实现文本的验证;v(5)能定义和使用委托类型;v(6)能给对象添加事件并能处理事件;v(7)能使用集合类存储数据,能编写基于栈、队列、链表、哈希表等数据结构的程序。教学任务v任务1 异常处理v任务2 枚举和结构v任务3 委托和事件v任务4 字符串与正
2、则表达式v任务5 泛型和集合单元4 C#进阶编程任务3 委托和事件引例官兵抓强盗v当受害人呼叫“救命啊!”,强盗纷纷逃跑,官兵开始追捕强盗。知识储备v知识点1:委托的定义。v知识点2:实例化委托。v知识点3:调用委托。v知识点4:多播委托。v知识点5:事件的定义。v知识点6:订阅和引发事件。知识点1:委托的定义v委托可以理解为函数指针,也就是说它能够通过传递地址的机制完成引用函数,但是它比函数指针安全,也称为委托是类型安全的。而事件借助委托的帮助,使用委托调用已订阅事件的对象中的方法。v在前面介绍定义方法的时候,我们可以将基本数据类型作为方法的参数,也可以将类实例化的对象做为方法参数传递,而C
3、#提供的委托可以将方法作为参数传递。委托定义了方法的类型,使得方法可以当作另一个方法的参数来进行传递。v使用委托可以将多个方法绑定到同一个委托变量,当调用此变量时,可以依次调用所有绑定的方法。定义委托v定义委托,其形式如下:v委托的定义用关键字“delegate”修饰。Login表示委托名,该委托接受2个参数。委托的一个要点是它们的类型安全性非常高。在定义委托时,必须给出委托所代表的方法的全部细节。委托的返回类型和参数共同组成为委托的签名。delegate void Login(string name,string password);示例:v定义一个委托Max,该委托代表的方法有两个int型
4、参数,返回类型为int。delegate int Max(int first,int second);知识点2:实例化委托v委托定义完后,就可以实例化委托了,实例化委托意味着引用某个方法。要实例化委托,就要调用该委托的构造函数,并将该委托关联的方法作为其参数传递。public delegate int Max(int first,int second);class MaxData public int IntMax(int a,int b)if(a b)return a;else return b;public double DoubleMax(double a,double b)if(a b
5、)return a;else return b;class Test static void Main()Max max;MaxData md=new MaxData();max=new Max(md.IntMax);/实例化委托 知识点3:调用委托v调用委托即是用委托对方法进行实例化,调用委托与调用方法类似,唯一的区别在于不是调用委托的实现,而是调用委托关联的方法。class Test static void Main()Max max;MaxData md=new MaxData();max=new Max(md.IntMax);int a=max(2,3);/调用委托 Console.W
6、riteLine(a.ToString();/max=new Max(md.DoubleMax);/错误代码,返回类型错误 /double b=max(2.0,3.0);/重载与委托不匹配 /Console.WriteLine(b.ToString();Console.ReadKey();实践任务1v使用委托实现三个数求最大值和最小值。知识点4:多播委托v前面介绍的委托中,每个委托都只包含一个方法的调用,在这种情况下,使用委托还不如直接使用方法来的直接,其实委托也可以包含多个方法,这个委托称为多播委托。v调用多播委托就可以连续调用多个方法,但委托的定义的返回类型必须是void,而编译器在返回类
7、型为void时,就会自动假定这是一个多播委托。v多播委托可以识别运算符+和+=,表示在委托中增加方法的调用,多播委托还识别运算符-和-=,表示从委托删除方法调用。示例:delegate void Del(string s);class TestClass static void Hello(string s)System.Console.WriteLine(Hello,0!,s);static void Goodbye(string s)System.Console.WriteLine(Goodbye,0!,s);static void Main()Del a,b,c,d;/Create th
8、e delegate object a that references /the method Hello:a=Hello;/Create the delegate object b that references /the method Goodbye:b=Goodbye;/The two delegates,a and b,are composed to form c:c=a+b;/Remove a from the composed delegate,leaving d,/which calls only the method Goodbye:d=c-a;System.Console.W
9、riteLine(Invoking delegate a:);a(A);System.Console.WriteLine(Invoking delegate b:);b(B);System.Console.WriteLine(Invoking delegate c:);c(C);System.Console.WriteLine(Invoking delegate d:);d(D);知识点5:事件的定义vC#使用delegate和event关键字提供了一个简洁的事件处理方案。C#中类和对象可以通过事件向其他类或对象通知发生的相关事情。将发生的事件通知给其他对象的对象称为发行者,一个对象订阅事件后
10、,该对象成为订阅者。一个事件可以有一个或者多个订阅者,事件的发行者也可以是该事件的订阅者。事件定义的语法vevent关键字用在发行者类中声明事件。定义事件时,发行者首先定义委托,然后根据该委托定义事件。访问修饰符 event 委托名 事件名 public delegate void EventHandler(Object sender,EventArgs e);public event EventHandler NoDataEventHandler;事件具有以下特点:v发行者确定何时引发事件,订户确定执行何种操作来响应该事件。v一个事件可以有多个订户,一个订户可以处理来自多个发行者的多个事件。
11、v没有订户的事件永不被调用。知识点6:订阅和引发事件v订阅事件v订阅事件只是添加了一个委托,当引发事件时,该委托将调用一个方法。订阅事件的形式如下:v代码中,ex对象订阅了事件NoDataEventHandler。当事件NoDataEventHandler被引发时,则会执行名为ex_NoDataEventHandler的方法。EventExample ex=new EventExample();ex.NoDataEventHandler+=new EventExample.EventHandler(ex_NoDataEventHandler);引发事件v引发事件和调用方法类似,引发事件时,将调
12、用订阅此特定事件的对象的所有委托,如果没有对象订阅该事件,则事件引发时,会发生异常。【例4-2】比较两个数的大小。class EventExample public delegate void DelegateMax(int first,int second);public event DelegateMax EventMax;public void IntMax(int a,int b)Console.WriteLine(判断两个数的大小0和1,较大的是:,a,b);EventMax(a,b);class Test static void Main()EventExample ee=new
13、EventExample();ee.EventMax+=new EventExample.DelegateMax(ee_EventMax);/订阅事件 ee.IntMax(2,3);/引发事件 Console.ReadKey();static void ee_EventMax(int first,int second)if(first second)Console.WriteLine(first);else Console.WriteLine(second);实践任务2v为实践任务1中的委托定义事件、订阅事件及激发事件。引例分析与实现v官兵抓强盗实现,当受害人呼喊“救命”的时候,只有强盗和官兵
14、才有相应的行动,其他的无行动。class Robber public void runaway()Console.WriteLine(逃跑);class Police public void chase()Console.WriteLine(哪里跑);class Human public delegate void humandelegate();public event humandelegate humanevent;public void Help()humanevent();class Program static void Main(string args)Human h=new H
15、uman();Robber r1=new Robber();Robber r2=new Robber();Police p1=new Police();Police p2=new Police();h.humanevent+=new Human.humandelegate(h_humanevent);h.humanevent+=r1.runaway;h.humanevent+=r2.runaway;h.humanevent+=p1.chase;h.humanevent+=p2.chase;h.Help();Console.ReadKey();static void h_humanevent()Console.WriteLine(救命啊);归纳总结v知识要点:v(1)委托类型定义方法。v(2)委托的使用。v(3)定义事件、订阅事件和激发事件。拓展实践v为汽车类设计“加油”事件。