C#面向对象程序设计 教学课件 ppt 作者 王晶晶 主编 第6章

上传人:E**** 文档编号:89188416 上传时间:2019-05-21 格式:PPT 页数:69 大小:347KB
返回 下载 相关 举报
C#面向对象程序设计 教学课件 ppt 作者 王晶晶 主编 第6章_第1页
第1页 / 共69页
C#面向对象程序设计 教学课件 ppt 作者 王晶晶 主编 第6章_第2页
第2页 / 共69页
C#面向对象程序设计 教学课件 ppt 作者 王晶晶 主编 第6章_第3页
第3页 / 共69页
C#面向对象程序设计 教学课件 ppt 作者 王晶晶 主编 第6章_第4页
第4页 / 共69页
C#面向对象程序设计 教学课件 ppt 作者 王晶晶 主编 第6章_第5页
第5页 / 共69页
点击查看更多>>
资源描述

《C#面向对象程序设计 教学课件 ppt 作者 王晶晶 主编 第6章》由会员分享,可在线阅读,更多相关《C#面向对象程序设计 教学课件 ppt 作者 王晶晶 主编 第6章(69页珍藏版)》请在金锄头文库上搜索。

1、应用程序在运行过程中通常会引发各种情况,有的情况类似于单击应用程序窗口中的按钮,这类情况称为事件;有的情况则类似于被零除等意外情形,这类情况称为异常,无论发生何种情况,程序都要对此进行处理,C#中对事件的处理是通过委托机制实现的,本章将详细介绍委托、事件和异常处理。,第6章 委托、事件及异常处理,6.1 委托 假设你是一个程序员,正在编写一个A网页,而JS部分你不熟悉,这时你可以“委托”你的同事来完成这部分操作。这就是委托,把你不能做的事情委托给别人来完成。C#中委托类似于C+中的函数指针,在程序运行时调用不同的函数,为操作函数提供了很大的灵活性和安全性。 使用委托分为以下三步: 1. 委托声

2、明 2. 委托实例化 3. 委托调用,6.1.1 委托声明 委托是一种引用类型,使用delegate关键字进行声明。 语法 访问修饰符delegate 返回类型 委托名(参数列表); 说明: 1.委托的声明与函数的声明类似,注意没有函数体; 2.委托使用一组特定的参数和返回来封装方法,封装与它匹配(即具有相同的参数和返回类型)的所有方法;,例6-1 声明一个委托 delegate int NumDelegate(int a,int b); 这就声明了一个委托,它的含义是:如果用这个委托作事情的话,做事情的方法必须满足以下条件: 方法的参数的个数、类型和顺序必须与委托相同; 方法的返回值必须与委

3、托相同;,6.1.2 委托实例化 在声明委托后,就可以实例化委托,即创建委托对象,并把与该委托对象关联的方法的名字作为它的参数。因此,创建委托对象前,需要先定义好欲调用的方法。由于该方法是通过delegate委托调用的,故该方法的参数类型、个数和返回值都必须和定义委托的类型一致。然后,就可以创建委托对象。,例6-2 实例化委托NumDelegate /定义委托需要调用的方法Add private static int Add(int num1, int num2) return (num1 + num2); /创建委托实例p1 NumDelegate p1 = new NumDelegate(

4、Add); 先定义与委托NumDelegate匹配的方法Add,然后用方法名Add作为参数对委托NumDelegate进行实例化,这样委托实例p1就与方法Add相关联。,6.1.3 委托调用 调用委托意味着调用与委托相关联的方法。调用委托与调用方法相似,唯一的区别在于不是调用委托的实现代码(委托没有实现代码),而是调用与委托相关联的方法的实现代码。 例6-3 调用委托 p1(1, 2); /委托调用 实例化委托NumDelegate时,使用方法Add作为参数,所以调用委托实例p1时,实际上调用的是与委托相关联的方法Add。,例6-4 委托的应用 using System; using Syst

5、em.Collections.Generic; using System.Text; namespace delegateExample delegate int NumDelegate(int a, int b); /委托声明,class Class1 private static int Add(int num1, int num2) return (num1 + num2); private static int Subtract(int num1, int num2) return (num1 -num2); private static int Multiply(int num1,

6、int num2) return (num1 * num2); private static int Divide(int num1, int num2) return (num1 / num2); static void Main(string args) /Class1 c1 = new Class1(); NumDelegate p1 = new,NumDelegate(Add); /委托实例化 Console.WriteLine(p1(1, 2); /委托调用 NumDelegate p2 = new NumDelegate(Subtract); /委托实例化 Console.Writ

7、eLine(p2(5, 3); /委托调用 NumDelegate p3 = new NumDelegate(Multiply); /委托实例化 Console.WriteLine(p3(2, 3); /委托调用 NumDelegate p4 = new NumDelegate(Divide); /委托实例化 Console.WriteLine(p4(6, 3); /委托调用 Console.ReadLine(); 程序运行结果如图6-1所示。,图6-1 程序运行结果,以上程序中,首先声明委托NumDelegate,然后定义了与委托相匹配的四个方法Add、Subtract、Multiply和D

8、ivide,接下来分别使用方法名Add、Subtract、Multiply和Divide实例化委托,得到四个委托实例p1、p2、p3、p4。调用委托实例p1、p2、p3、p4时,便调用与委托实例相关联的方法。委托实例p1相关联的方法是Add,委托实例p2相关联的方法是Subtract,委托实例p3相关联的方法是Multiply,委托实例p4相关联的方法是Divide。 C# 2.0中,实例化委托时可以将方法名直接赋值给委托实例。上述程序中,语句NumDelegate p1 = new NumDelegate(Add);可以简化成NumDelegate p1 = Add;,6.1.4 匿名方法委

9、托 在C# v1.1中,声明委托的唯一方法是使用命名方法,即声明和使用委托要求事先存在委托和与委托相匹配的方法,例6-4中使用的就是这种方法。C# v2.0中,引入了匿名方法。使用匿名方法,不必创建单独的方法,减少了实例化委托所需的系统开销。 要将代码块作为委托参数,则创建匿名方法是唯一途径。,例6-5 委托与匿名方法关联 using System; using System.Collections.Generic; using System.Text; namespace ConsoleApplication1 delegate void Printer(string s); / 声明一个委

10、托 class TestClass static void Main() / 委托与匿名方法关联 Printer p = delegate(string j) System.Console.WriteLine(j); ; / 调用委托 p(“The delegate using the anonymous method is called.”); 深色部分的代码便是创建一个匿名方法的委托,将代码块作为委托的参数。程序运行结果如图6-2所示。,图6-2 程序运行结果,例6-6 委托被同时映射到静态方法和实例方法 using System; using System.Collections.Gen

11、eric; using System.Text; namespace multidelegateExample delegate void Del();/ 声明委托Del,class SampleClass public void InstanceMethod() System.Console.WriteLine(“A message from the instance method.”); public static void StaticMethod() System.Console.WriteLine(“A message from the static method.”); ,clas

12、s TestSampleClass static void Main() SampleClass sc = new SampleClass(); Del d = sc.InstanceMethod; / 将委托映射到实例方法 d(); d = SampleClass.StaticMethod; / 将委托映射到静态方法 d(); 程序运行结果如图6-3所示。,上述程序中,委托d被同时映射到静态方法和实例方法。实例方法需用类的实例调用;而静态方法则是类直接调用。,图6-3 程序运行结果,6.1.5 多路广播委托 目前为止,我们所使用的委托只包含一个方法的调用。如果调用多个方法,则需要多次调用委托

13、。C#中多路广播委托可以很好的解决这一问题。多路广播委托就是委托中可以包含多个方法,这样调用一个委托便可以调用多个方法。多路广播委托在处理事件响应中起到很重要的作用。 多路广播委托通过“+”运算符向委托中添加调用方法,“-”运算符移除委托中的某个方法。也可以使用“+=”和“-=”赋值运算符向委托中添加和移除方法。,多路广播委托具有以下特点: 1.多路广播委托包含一个以上方法的调用; 2.多路广播委托包含的方法必须返回void,否则会抛出异常。,例6-7 多路广播委托的应用 using System; using System.Collections.Generic; using System.

14、Text; namespace multidelegateExample delegate void NumDelegate(int a, int b); /委托声明,多路广播委托必须是void,class Class1 private static void Add(int num1, int num2) int result; result = num1 + num2; Console.WriteLine(“两数之和是:0”,result); private static void Subtract(int num1, int num2) int result; result=num1 - num2; Console.WriteLine(“两数之差是:0”,result); ,private static void Multiply(int num1, int num2) int result; result = num1 * num2; Console.WriteLine(“两数之积是:0”,result); private static void Divide(int num1, int num2) int result; result = n

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号