教学课件第11章 委托与事件.ppt
《教学课件第11章 委托与事件.ppt》由会员分享,可在线阅读,更多相关《教学课件第11章 委托与事件.ppt(28页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、C#程序设计案例教程程序设计案例教程第第11章章 委托与事件委托与事件 第第11章章 委托与事件委托与事件 学习目标学习目标了解委托的类型。了解委托的类型。掌握委托的声明和使用。掌握委托的声明和使用。掌握事件的定义和引发。掌握事件的定义和引发。第第11章章 委托与事件委托与事件 11.1 使用委托使用委托【课堂案例课堂案例11-1】阅读下面的程序,了解委托的使用并阅读下面的程序,了解委托的使用并预测程序的输出结果。预测程序的输出结果。Public delegate void GreetingDelegate(string name);Class Test public void English
2、Greeting(string name) Console.WriteLine(“Morning, ” + name); public void ChineseGreeting(string name) Console.WriteLine(“早上好,早上好, ” + name); Class Program static void Main(string args) Test test = new Test(); GreetingDelegate delegate1 = new GreetingDelegate(test.EnglishGreeting); GreetingDelegate d
3、elegate2 = new GreetingDelegate(test.ChineseGreeting); delegate1(“XiaoMing”); delegate2(“小明小明”); 第第11章章 委托与事件委托与事件 【案例学习目标案例学习目标】了解委托的声明。了解委托的声明。了解委托的使用。了解委托的使用。【案例知识要点案例知识要点】声明委托和使用委托。声明委托和使用委托。【案例完成步骤案例完成步骤】(1)初步认识委托。)初步认识委托。(2)预测程序的输出结果。)预测程序的输出结果。第第11章章 委托与事件委托与事件 11.1.1 初步初步认识委托认识委托 什么是委托?委托又称“
4、代表”、“指代”。委托是一种特殊的数据类型,派生于System.Delegate类。委托对象主要用于保存方法的引用。 在面向对象程序设计中,有时我们并不想直接调用一个方法,而是希望能够将它作为参数传递给其他方法,即不直接使用方法名来调用方法体。在C#中,采用委托就能实现该功能。一旦为委托分配了方法,委托将与该方法具有完全相同的行为。委托方法的使用可以像其他任何方法一样,具有参数和返回值。 第第11章章 委托与事件委托与事件 1.声明委托在C#中要使用委托,需要先定义委托,然后再创建该委托的一个或多个实例。委托的定义格式如下:访问修饰符 delegate (形式列表参数);其中:(1)返回类型:
5、是指委托所指向方法的返回值的类型。委托的返回类型必须与委托所指向的方法的返回类型一致,才能成功使用该委托。(2)形参列表:用于指出委托所指向方法的参数列表,这个列表必须与委托所指向方法的参数列表中的参数个数及其参数类型一致,包括形参的顺序、个数和类型。第第11章章 委托与事件委托与事件 例如:public delegate void MyDelegate(int a) ; /声明委托在课堂案例11-1给出的代码段中,第3行声明了一个名为GreetingDelegate的委托。根据委托的意义,我们知道该类型的委托只能指向那些和声明委托中具有相同参数列表及返回值类型的方法。说明:说明:(1)由于委
6、托类型定义是定义一种新的类型,所以可以写在类的外部,也可以写在)由于委托类型定义是定义一种新的类型,所以可以写在类的外部,也可以写在类的内部。若在类的内部定义,则类型为类的内部。若在类的内部定义,则类型为“类名类名.委托名委托名”(2)指定的访问修饰符对定义的委托对象有限制作用,应与委托对象的访问权限一)指定的访问修饰符对定义的委托对象有限制作用,应与委托对象的访问权限一致或高于委托对象的访问权限,在类的外部定义只能是致或高于委托对象的访问权限,在类的外部定义只能是public或或internal,当不写时,当不写时,默认为默认为internal。第第11章章 委托与事件委托与事件 2.使用委
7、托使用委托的目的是通过委托对象来保存方法的引用,使得可以不必显式地给出方法名就能调用并执行方法体中的程序段。委托的使用可以分成如下几点实现:(1)声明一个delegate对象,它与要传递的方法具有相同的参数类型和返回值类型。(2)创建delegate对象,并将要传递的函数作为参数传入。创建delegate对象的格式如下: = new ();第第11章章 委托与事件委托与事件 通知分析课堂案例11-1的代码段可知,程序的第2022行分别创建了名为delegate1和delegate2的delegate类型对象。其中,delegate1指向test对象的EnglishGreeting方法成员,de
8、legate2则指向ChineseGreeting方法成员。/定义delegate1对象GreetingDelegate delegate1 = new GreetingDelegate(test.EnglishGreeting);/定义delegate2对象GreetingDelegate delegate2 = new GreetingDelegate(test.ChineseGreeting);说明:说明:(1)创建委托对象时,访问修饰符受委托类型的限制应与委托类型访问权限一致或)创建委托对象时,访问修饰符受委托类型的限制应与委托类型访问权限一致或低于委托类型的访问权限。低于委托类型的访
9、问权限。(2)委托对象的定义可以放在类的内部,作为类的数据成员,也可以在方法内定义,)委托对象的定义可以放在类的内部,作为类的数据成员,也可以在方法内定义,作为方法的局部变量。作为方法的局部变量。(3)委托对象的定义与其他引用类型对象定义的格式基本相同。)委托对象的定义与其他引用类型对象定义的格式基本相同。(4)参数可以是某一方法名,也可以是另一个同类型委托对象,封装方法只写方法名。)参数可以是某一方法名,也可以是另一个同类型委托对象,封装方法只写方法名。第第11章章 委托与事件委托与事件 11.1.2 预测程序的输出预测程序的输出 根据对根据对课堂案例课堂案例11-1的分析,程序的输出结果为
10、:的分析,程序的输出结果为:Morning,XiaoMing早上好,小明早上好,小明第第11章章 委托与事件委托与事件 课堂实践课堂实践11-1预测下面程序的输出结果。预测下面程序的输出结果。Delegate int MyDelegate(string x); /定义一个代理定义一个代理Public class MyClass /定义一个类定义一个类 public static int StaticMethod(string x) /静态方法静态方法 Console.WriteLine(“类的静态方法:类的静态方法:0”,x); return 0; public int InstanceMet
11、hod(string x) /实例方法实例方法 Console.WriteLine(“类的实例方法:类的实例方法:0”,x); return 0; Public class App public static void Mina() public static void Main() MyClass c = new MyClass(); /创建一个类创建一个类MyClass的对象的对象 /创建代理对象创建代理对象d1,调用实例方法调用实例方法 MyDelegate d1 =new MyDelegate(c.INstanceMethod); /创建代理对象创建代理对象d2,调用静态方法调用静态方
12、法 MyDelegate d2 = new MyDelegate(MyClass.StaticMehtod); d1(“this is a dog”); d2(“this is a cat”); 第第11章章 委托与事件委托与事件 11.2 多路广播委托多路广播委托【课堂案例课堂案例11-2】阅读下面的程序,识别委托的类型并阅读下面的程序,识别委托的类型并预测程序的输出结果预测程序的输出结果。/定义委托,它定义了可以代表的方法类型定义委托,它定义了可以代表的方法类型Public delegate void GreetingDelegate(string name);Class Test pub
13、lic void EnglishGreeting(string name) Console.WriteLine(“Morning, ” + name); public void ChineseGreeting(string name) Console.WriteLine(“早上好,早上好,” + name); Class Program static void Main(string args) Test test = new Test (); GreetingDelegate delegate1 = new GreetingDelegate(test.EnglishGreeting); de
14、legate1+=test.ChineseGreeting; delegate1(“XiaoMing”); Console.WriteLine(); delegate1-=test.EnglishGreeting; delegate1(“小明小明”); 第第11章章 委托与事件委托与事件 【案例学习目标案例学习目标】了解多路广播委托的特点。了解多路广播委托的特点。【案例知识要点案例知识要点】多路广播委托。多路广播委托。【案例完成步骤案例完成步骤】(1)初步认识多路广播委托。)初步认识多路广播委托。(2)预测程序的输出结果。)预测程序的输出结果。第第11章章 委托与事件委托与事件 11.2.1
15、初步初步认识多路广播委托认识多路广播委托 委托可以分为单路广播委托和多路广播委托。 单路广播委托来自于System.Delegate类,它一次仅包含一个方法的引用。课堂案例11-1使用的就是单路广播委托。单路广播委托调用委托的次数与调用方法的次数相同。如果要调用多个方法,就需要多次显式调用这个委托。 多路广播委托来自于MulticastDelegate类。它包含多个方法的调用列表。在多路广播委托中,可以创建一个单路广播委托,然后调用多个封装的方法。多路广播委托保持对多个方法的使用,所以,当调用一个多路广播委托时,它将执行调用序列中的所有方法。 在C#中,使用“+=”可以组合两个委托实例,通过“
16、-=”可以从一个多路广播委托中删除一个委托实例。 第第11章章 委托与事件委托与事件 以课堂案例11-2为例,在程序段中使用了多路广播委托的方式分别调用EnglishGreeting和ChineseGreeting方法。对于课堂案例11-2,分析如下:(1)第21行:创建委托对象delegate1,使其保存方法EnglishGreeting的指向。(2)第22行:使用“+=”运算符,将已经指向的EnglishGreeting方法的委托实例delegate1也作为指向“+=”符号后的ChineseGreeting方法的委托实例。此时,委托实例delegate1实际上保存了EnglishGreet
17、ing和ChineseGreeting两个方法的指向。(3)第23行:使用委托对象delegate1来调用方法。该语句的执行效果相当于将字符串“XiaoMing”作为方法的形式参数,并顺序地执行EnglishGreeting和ChineseGreeting方法。(4)第25行:使用“-=”运符算,删除委托对象delegate1中保存的EnglishGreeting方法的指向。执行该语句后,delegate1仅保存了ChineseGreeting方法的指向。(5)第26行:通过delegate1对象调用方法。由于第25行语句已经删除了delegate1委托对象对Englishgreeting方法
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 教学课件第11章 委托与事件 教学 课件 11 委托 事件
限制150内