C#.NET程序设计 教学课件 ppt 作者 李旗 c#7

上传人:E**** 文档编号:89190977 上传时间:2019-05-21 格式:PPT 页数:40 大小:144.50KB
返回 下载 相关 举报
C#.NET程序设计 教学课件 ppt 作者 李旗 c#7_第1页
第1页 / 共40页
C#.NET程序设计 教学课件 ppt 作者 李旗 c#7_第2页
第2页 / 共40页
C#.NET程序设计 教学课件 ppt 作者 李旗 c#7_第3页
第3页 / 共40页
C#.NET程序设计 教学课件 ppt 作者 李旗 c#7_第4页
第4页 / 共40页
C#.NET程序设计 教学课件 ppt 作者 李旗 c#7_第5页
第5页 / 共40页
点击查看更多>>
资源描述

《C#.NET程序设计 教学课件 ppt 作者 李旗 c#7》由会员分享,可在线阅读,更多相关《C#.NET程序设计 教学课件 ppt 作者 李旗 c#7(40页珍藏版)》请在金锄头文库上搜索。

1、第七章 委托与事件、泛型和反射,C#.net程序设计,本章主要内容,委托与事件 泛型类,结构,接口和泛型成员 可空类型 反射获取和加载程序集,反射获取类型及其成员,调用实例方法,委托,委托delegate是一种引用数据类型,委托的对象实例中存放的是方法的引用。 调用委托时,它可以调用多个方法。这称为多路广播。若要向委托的方法列表(调用列表)中添加额外的方法,只需使用加法运算符或加法赋值运算符(“+”或“+=”)添加两个委托。若要从调用列表中移除方法,使用减法运算符或减法赋值运算符(“-”或“-=”)。 下面通过实例演示使用加法运算符“+”向委托的方法列表中添加额外的方法,以及使用减法运算符“-

2、” 从调用列表中移除方法。,委托与事件,事件概述,事件是类在发生其关注的事情时用来提供通知的一种方式。引发事件的对象称为事件的源或发送者。对象引发事件的原因很多:例如按钮单击或菜单选择等。 事件具有以下特点: 事件是用来通知对象需要执行某种操作的方式。 事件通常用在图形用户界面中。 事件通常使用委托事件处理程序进行声明。 事件可以调用匿名方法来替代委托。,委托与事件,使用事件,使用事件步骤是:声明事件委托类型定义、引发事件类定义和接受事件类订阅事件。 声明事件委托类型 事件和方法一样具有签名,签名包括名称和参数列表。事件的签名通过委托类型来定义,因此首先为事件声明一个委托,如: public

3、delegate void ChangedEventHandler(object sender, EventArgs e); .NET 框架中事件的签名中,通常第一个参数为引用事件的源对象,第二个参数为一个传送与事件相关的数据对象。并不强制使用这种形式,只要事件签名返回 void。,委托与事件,使用事件,在事件发送类中添加事件,需要使用event关键字,并提供委托类型和事件名称。例如: public event ChangedEventHandler Changed; 引发事件类定义 若要引发事件,类可以调用委托,并传递所有与事件有关的参数。然后,委托调用已添加到该事件(如上例的Changed

4、事件)的所有处理程序。例如下面代码中:Changed(this, e);,委托与事件,public class ListWithChangedEvent : ArrayList/一个每次列表更改时发送通知的类 / 事件,每当列表元素更改时,客户端可利用该事件获得通知。 public event ChangedEventHandler Changed; protected virtual void OnChanged(EventArgs e) /每当列表更改时调用Changed事件 if (Changed != null) /确保该事件不为空 Changed(this, e); /调用Chang

5、ed事件 / 重写可更改列表的Add方法;在每个重写后调用事件 public override int Add(object value) int i = base.Add(value); /调用基类ArrayList的Add方法 OnChanged(EventArgs.Empty); /触发Changed事件 return i; ,使用事件,接受事件类订阅事件 要接收某个事件的类(如下面EventListener)可以创建一个方法来接收该事件,接收类必须具有与事件具有相同签名(如委托签名)的方法,该方法(称为事件处理程序)可以采取适当的操作来响应该事件,下例为ListChanged方法。然后

6、向引发事件类实例的事件使用+=添加该方法的一个委托。即下例的List.Changed += new ChangedEventHandler(ListChanged);这个过程称为“订阅事件”。,委托与事件,class EventListener private ListWithChangedEvent List; public EventListener(ListWithChangedEvent list) List = list; / 将“ListChanged”添加到“List”中的 Changed 事件。 List.Changed += new ChangedEventHandler(L

7、istChanged); / 每当列表更改时就会进行以下调用。 private void ListChanged(object sender, EventArgs e) Console.WriteLine(“事件触发“); public void Detach() / 分离事件并删除列表 List.Changed -= new ChangedEventHandler(ListChanged); List = null; ,使用事件,在类Test主函数Main()中创建引发事件类实例和接受事件类实例,代码如下: class Test / 测试 ListWithChangedEvent 类。 pu

8、blic static void Main() / 创建新列表,引发事件类实例。 ListWithChangedEvent list = new ListWithChangedEvent(); / 创建一个类,用于侦听列表的更改事件。 EventListener listener = new EventListener(list); list.Add(“item 1“);/ 在列表中添加项。触发事件显示“事件触发“ listener.Detach();/ 分离事件,之后不再处理事件. list.Add(“item 2“);/ 在列表中添加项。不显示“事件触发“ ,委托与事件,.NET框架事件的

9、委托类型,.NET框架用于事件的委托类型采用两个参数:“对象源”参数(用于指示事件源)和特定于事件的参数(它封装有关事件的其他任何信息)。特定于事件的参数应从 EventArgs 类派生。对于不使用任何附加信息的事件,.NET框架 提供了 EventHandler 委托类型: public delegate void EventHandler (Object sender, EventArgs e); 因此前面例子的事件委托类型ChangedEventHandler可将其更改为EventHandler 委托类型,从而符合NET 框架的事件准则。,委托与事件,Windows应用程序事件处理机制,

10、下面解释第一章WelcomeWorld项目的form1.cs使用按钮事件的处理机制: 用来定义按钮事件的委托类型是.Net框架定义的委托: public delegate void EventHandler (Object sender, EventArgs e) Button(发送类)具有事件: public event EventHandler Click。 Form1(接收类)定义创建一个方法btnOk_Click来接收该事件 public partial class Form1 : Form private void btnOk_Click(object sender, EventAr

11、gs e) MessageBox.Show(“您好!“ + txtUserName.Text); ,订阅事件:Form1向btnOk按钮(发送类)的Click事件使用+=添加处理方法btnOk_Click的委托来订阅事件。 partial class Form1 private void InitializeComponent() this.btnOk.Click += new System.EventHandler(this.btnOk_Click); 当鼠标点击btnOk按钮将触发按钮的Click事件,该事件将调用添加到事件委托的btnOk_Click方法,完成所需的处理工作。,泛型概述,

12、泛型是一种参数化类型,可以实现在相同代码上操作多种数据类型。泛型编程利用“参数化类型”将类型抽象化,从而实现更为灵活的复用。 类型参数使得类和方法将一个或多个类型的指定推迟到声明并实例化该类或方法的时候。 泛型赋予了代码具有更强的类型安全,更好的复用,更高的效率,更清晰的约束。下面是一个泛型类MyStack的定义,以及泛型对象的实例化。,泛型,泛型概述,class MyStack private T store; private int size; public MyStack() store = new T10; size = 0; public void Push(T x) storesi

13、ze+ = x; public T Pop() return store-size; class Test static public void Main() MyStack x = new MyStack(); x.Push(17); ,泛型,泛型泛型概述,泛型的主要特点: 使用泛型类型可以最大限度地重用代码、保护类型的安全以及提高性能。 泛型最常见的用途是创建集合类。 .NET框架类库的System.Collections.Generic 命名空间包含新的泛型集合类如List 泛型类。应尽可能使用泛型集合类代替普通集合类,如使用List替代System.Collections命名空间Arr

14、ayList。 可以创建自己的泛型接口、泛型类、泛型方法、泛型事件和泛型委托。 可以对泛型类进行约束以对类型参数的类型种类施加限制。 关于泛型数据类型中使用的类型的信息可在运行时通过反射获取。,泛型,声明泛型类或结构,可单独声明泛型类型(包括类与结构)。也可在基类中包含泛型类型的声明。但基类如果是泛型类,它的类型参数要么已实例化,要么来自派生子类(同样是泛型类型)声明的类型参数。例如: class C。 /合法 class D:C。 /合法 class E:C。 /合法 class F:C。 /合法 class G:C。 /非法,泛型,泛型接口,泛型接口的类型参数要么已实例化,要么来源于实现类

15、声明的类型参数。 interface IDictionary void Add(K key,V value); class List:IList,IDictionary public void Add(int index,T value) ,泛型,泛型类型的数据成员,泛型类型的数据成员,可以使用泛型类型声明中的类型参数定义泛型类型的成员。 class C public V f1; /声明字段 public D f2; /作为其他泛型类型 的参数 public C this.f1 = x; ,泛型,泛型方法,泛型方法,泛型方法是使用类型参数声明的方法,如下所示: static void Swap

16、(ref T lhs, ref T rhs) T temp; temp = lhs; lhs = rhs; rhs = temp; 下面的代码示例演示一种使用 int 作为类型参数调用Swap泛型方法: public static void TestSwap() int a = 1; int b = 2; Swap(ref a, ref b);/ 也可以省略类型参数Swap(ref a, ref b); ,泛型,类型参数的约束,在定义泛型类时,可以对类型参数的类型种类施加限制。如果尝试使用某个约束所不允许的类型来实例化类,则会产生编译时错误。这些限制称为约束。约束是使用where关键字指定的。 约束可以指定“基类约束“,“接口约束“,“构造器约束“,“值类型/引用

展开阅读全文
相关资源
相关搜索

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

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