C#的面向对象程序设计.ppt

上传人:牧羊曲112 文档编号:6502370 上传时间:2023-11-07 格式:PPT 页数:77 大小:317.49KB
返回 下载 相关 举报
C#的面向对象程序设计.ppt_第1页
第1页 / 共77页
C#的面向对象程序设计.ppt_第2页
第2页 / 共77页
C#的面向对象程序设计.ppt_第3页
第3页 / 共77页
C#的面向对象程序设计.ppt_第4页
第4页 / 共77页
C#的面向对象程序设计.ppt_第5页
第5页 / 共77页
点击查看更多>>
资源描述

《C#的面向对象程序设计.ppt》由会员分享,可在线阅读,更多相关《C#的面向对象程序设计.ppt(77页珍藏版)》请在三一办公上搜索。

1、第6章 C#的面向对象程序设计,内容提要:类、对象的概念及使用 方法、属性、索引的概念、声明及调用 构造函数和析构函数的定义 继承和接口的用法 委托和事件的声明及调用目的要求:理解类、对象、构造函数和析构函数的意义 掌握方法、属性、索引的用法 掌握继承和接口、委托和事件的声明及调用重点难点:类、对象、方法、属性、继承、接口、委托和事件,面向对象的程序设计(OOP)的主要思想是将数据及处 理这些数据的操作都封装到一个称为类(Class)的数据结 构中。使用这个类时,只需要定义一个类的变量即可,这 个变量叫做对象(Object)。通过调用对象的数据成员完 成对类的使用。1.类 在面向对象理论中,类

2、(class)就是对具有相同特征的一类事物所做的抽象(或者说,归纳)。,6.1 面向对象程序设计的基本概念,2.对象 类是一种抽象,而对象(object)则是实例(instance),是具体的。如果使用如下格式来代表一个类生成一个对象:类名 对象名;则:电子计算机 ComputerA;电子计算机 ComputerB;就代表ComputerA和ComputerB是“电子计算机”类的 两个不同对象。,3.类的属性 属性说明了这个类的特点。例如“PC计算机”类则可能具备如下属性:计算机的名称 CPU类型 内存容量 硬盘容量 主板型号 显示适配器型号 声卡型号 操作系统类型 通过这些属性,就可以将不同

3、的PC计算机区分开。,4.类的方法 类的方法(method)代表了一类事物所具备的动作,是对属性的操作。比如:“石英钟”类的方法有:秒针前进一格、分秒针 前进一格、时针前进一格等,而“录像机”类所具备的方法 可以有:播放、定格、录像、倒带、快进等。,5.派生和继承 在类的继承中,被继承的类称为基类(又称为父类),由基类继承的类称为派生类(又称为子类)。派生类自动获 得基类的所有属性和方法,而且可以在派生类中添加新的属 性和方法。,6.多态性 多态性是指在一般类中定义的属性或行为,被特殊 类继承之后,可以具有不同数据类型或表现出不同的行 为。就是程序在运行时,会自动判断对象的派生类型,并调用相应

4、的方法。7.封装 封装就是把对象的属性和服务结合成一个独立的系 统单位,并尽可能隐蔽对象的内部细节。,6.2 类和对象 6.2.1 类的声明 类是C#的一种自定义数据类型,其声明格式为:类修饰符 class 类名:基类类名 类的成员;说明:C#支持的类修饰符有:new、public、protected、internal、private、abstract、sealed。,例:定义一个车辆类(有三个变量)class Vehicle public int passengers;/乘客数 public int fuelcap;/所耗燃料 public int mpg;/每公里耗油量,6.2.2 类的成

5、员 类的成员可以分为两大类:类本身所声明的,以及从基类其分为两种:一种不以函数形式体现,称为成员变量;另一种是以函数形式体现,称为成员函数。,1.类成员的访问修饰符(1)public:允许类的内部或外界直接访问;(2)private:不允许外界访问,也不允许派生类 访问,即只能在类的内部访问。如 果没有设定访问修饰符,默认为 private;(3)protected:不允许外界访问,但允许派生类 访问;(4)internal:只有本类的成员才能访问。(5)readonly:该成员的值只能读,不能写。也就 是说,除了赋予初始值外,在程序 的任何一个部分将无法更改这个成 员的值。,class Cl

6、assA public int a;private int b;protected int c;public void SetA()a=1;/正确,允许访问类自身公有成员 b=2;/正确,允许访问类自身私有成员 c=3;/正确,允许访问类自身保护成员 class ClassB:ClassA public void SetB()ClassA BaseA=new ClassA();BaseA.a=5;/正确,允许访问基类公有成员 BaseA.b=23;/错误,不允许访问基类私有成员 BaseA.c=68;/正确,允许访问基类保护成员 class ClassC public void SetB()C

7、lassA BaseA=new ClassA();BaseA.a=5;/正确,允许访问类的其他公有成员 BaseA.b=23;/错误,不允许访问类的其他私有成员 BaseA.c=68;/错误,不允许访问类的其他保护成员,2.静态成员与非静态成员 静态成员是在声明成员时在前面加上static保留字;非静态成员是在声明成员时前面没有static保留字;静态成员属于类所有,非静态成员属于类的对象所有。静态成员的访问格式:类名.静态成员名,若将类中的某个成员声明为static,则该成员称为静态 成员。类中的成员要么是静态的,要么是非静态的。类的非静态成员属于类的实例所有,每创建一个类的 实例都在内存中

8、为非静态成员开辟了一块区域。而类的静 态成员属于类所有,为这个类的所有实例所共享。无论这 个创建了多少个对象(实例),一个静态成员在内存中只 占有一块区域。,例:静态成员的访问using System;class Myclass public int nIndex=10;static public double fphi=45.6;class classTest static void Main()int a=Myclass.nIndex;/错误,因为nIndex是非静态成员 double b=Myclass.fphi;/正确,因为fphi是静态成员 Console.Write(b);,6.2

9、.3 对象的声明 创建类的对象。分两步:(1)先声明对象名 格式:类名 对象名;例:Vehicle minivan;/定义类Vehicle的一个对象(2)创建类的实例。格式:对象名=new 类名();例:minivan=new Vehicle();/创建一个实例 以上两步也可以合并成一步。格式:类名 对象名=new 类名();例:Vehicle minivan=new Vehicle();,6.3 构造函数和析构函数 C#中有两个特殊的函数:构造函数和析构函数。构造函数:当类实例化时首先执行的函数;析构函数:当实例(即对象)从内存中销毁前最后执行 的函数。,6.3.1 构造函数,在C#中,当创

10、建一个对象时,系统首先为这个对象赋予一个标识符,然后给对象分配合适的内存空间,随后系统就自动调用对象的构造函数。构造函数的类型修饰符总是public,因为构造函数主要是在类外创建对象时自动调用。格式:class 类名 public 类名()/构造函数体,例:using System;class MyClass public int x;public Myclass()/类MyClass的构造函数 x=10;class ConsDemo public static void Main()MyClass t1=new MyClass();MyClass t2=new MyClass();Conso

11、le.WriteLine(“0t1”,t1.x,t2.x);,运行结果如下:,构造函数也可以带参数。,例:using System;class Fruit public string color;public string shape;public Fruit(string c,string s)/类Fruit的构造函数 color=c;shape=s;class Test public static void Main()Fruit Orange=new Fruit(“orange”,”round”);/创建Orange实例 Console.WriteLine(“0,1”,Orange.co

12、lor,Orange.shape);,运行结果如下:,构造函数也可以重载。例:using System;class A public int count;public A()count=-1;public A(int n)count=n;class Test static void Main()A a=new A();Console.WriteLine(count=0,a.count);A b=new A(5);Console.WriteLine(count=0,b.count);,运行结果如下:,使用 this关键字 C#中的this关键字是用来代表对象自身。this一般用在构造函数中,以便

13、区别同名的构造函数参数和类成员变量。例:using System;class Point int x,y;public Point(int x,int y)this.x=x;this.y=y;,运行结果如下:,class Test static void Main()Point p=new Point(5,6);Console.WriteLine(x=0,p.x);Console.WriteLine(y=0,p.y);,6.3.2 析构函数,析构函数也是类的特殊的成员函数,它主要用于释放类实例。析构函数的特殊性表现在以下几个方面:(1)析构函数的名字与类名相同,但它前面需要 加一个“”符号;(

14、2)析构函数不能带参数,也没有返回值;(3)当撤消对象时,自动调用析构函数;(4)析构函数不能被继承,也不能被重载。,格式:class 类名 类名()/析构函数体 析构函数以与构造函数相反的顺序被调用。,例:using System;class Decon1 public Decon1()Console.WriteLine(“调用构造函数Decon1”);Decon1()Console.WriteLine(“调用析构函数Decon1”);class Decon2 public Decon2()Console.WriteLine(“调用构造函数Decon2”);Decon2()Console.W

15、riteLine(“调用析构函数Decon2”);class Test public static void Main()Decon1 dec1=new Decon1();Decon2 dec2=new Decon2();,运行结果如下:,可以按照程序代码执行的功能或其他依据把相关的语句组织在一起,并给它们注明相应的名称,利用这种方式把程序分块,就形成了类的方法。方法的功能是通过方法调用实现的。方法调用指定了被调用方法的名字和调用方法所需的信息(参数),调用方法要求被调用方法按照方法参数完成某个任务,并在完成这项任务后由方法返回。如果调用过程出错,则无法完成正常的任务。,6.4 方法,6.4.

16、1 方法的定义及调用,方法是类中用于计算或进行其他操作的成员。类的方法主要用来操作类的数据,提供一种访问数据的途径。1.方法的定义 格式:修饰符 返回值类型 方法名(形式参数列表)方法体各语句;,说明:(1)如果省略“方法修饰符”,该方法为类的私 有成员。(2)“返回类型”指定该方法返回数据的类型,它可以是任何有效的类型。如果方法不需 要返回一个值,其返回类型必须是void。(3)“方法参数列表”是用逗号分隔的类型、标 识符对。这里的参数是形式参数,本质上 是一个变量,它用来在调用方法时接收传 给方法的实际参数值,如果方法没有参 数,那么参数列表为空。,2.从方法返回,一般来说有两种情况将导致

17、方法返回。第一种情况:当碰到方法的结束花括号。第二种情况:执行到return语句。有两种形式的 return:一种用在void方法中(就是那些没有返回值的方法),另一种用在有返回值的方法中。,例:通过方法的结束花括号返回。using System;class Test public void myMeth()int j;for(j=0;j10;j+)if(j%3=0)continue;Console.WriteLine(“0t”,j);static void Main()Test lei=new Test();lei.myMeth();,运行结果如下:,C#允许在一个方法中,有两个或多个ret

18、urn语句,特别是当方法有多个分支时。例:using System;class Test public void myMeth()int j=8;if(j=5)j=j*2;Console.WriteLine(j);return;else j=j*3;Console.WriteLine(j);return;static void Main()Test lei=new Test();lei.myMeth();,运行结果如下:,注意:一个void方法在下述情况之一下将返回程序执行时碰到方法的结束花括号;或者程序执行到一条return语句时。使用下述形式的return语句来从方法返回一个值给调用者。格

19、式:return value;说明:这里value是要从方法中返回的值。,例:用return语句返回值。public int myMeth()int j=8;if(j=5)return j*2;else return j*3;,6.4.2 方法的参数类型 调用方法时,可以给方法传递一个或多个值。传给方法的值叫做实参(argument),在方法内部,接收实参值的变量叫做形参(parameter),形参在紧跟着方法名的括号中声明。形参的声明语法与变量的声明语法一样。形参只在方法内部有效,除了将接收实参的值外,它与一般的变量没什么区别。C#方法的参数类型主要有:值参数、引用参数和输出参数。,1值参数

20、 未用任何修饰符声明的参数为值参数。值参数在调用该参数所属的函数成员时创建,并用调用中给定的实参值初始化。当从该函数返回时值参数被销毁。对值参数的修改不会影响到原自变量。值参数通过复制原自变量的值来初始化。,例:使用值参数。using System;class Test public void Swap(int x,int y)int k;k=x;x=y;y=x;static void Main()int a=8,b=68;Console.WriteLine(a=0,y=1,a,b);Test sw=new Test();sw.Swap(a,b);Console.WriteLine(a=0,y

21、=1,a,b);,程序的运行结果为:a=8,b=68 a=8,b=68,2.引用型参数 用ref修饰符声明的参数为引用参数。引用参数本身并不创建新的存储空间,而是将实参的存储地址传递给形参。可以认为引用参数中就是调用方法时给出的变量,而不是一个新变量。在函数调用中,引用参数必须被赋初值。在调用时,传送给ref参数的必须是变量,类型必须相同,并且必须使用ref修饰。格式:方法修饰符 返回类型 方法名(,ref参数1,ref 参数 2,)方法实现部分;调用方法时,实参前面也必须要加上ref。,例:使用引用参数。using System;class Test public void Swap(ref

22、 int x,ref int y)int k;k=x;x=y;y=x;static void Main()int a=8,b=68;Console.WriteLine(a=0,y=1,a,b);Test sw=new Test();sw.Swap(ref a,ref b);Console.WriteLine(a=0,y=1,a,b);,程序的运行结果为:a=8,b=68 a=68,b=8,3.输出参数 用out修饰符定义的参数称为输出参数。如果希望方法返回 多个值,可使用输出参数。格式:方法修饰符 返回类型 方法名(,out 参数1,out 参数 2,)方法实现部分;调用方法时,实参前面也要加

23、上out。,例:使用输出参数using System;class MyClass public string TestOut(out string i)i=使用out关键字;return out参数;class test static void Main()string x;MyClass app=new MyClass();Console.WriteLine(app.TestOut(out x);Console.WriteLine(x);,运行结果如下:,例:using System;class TestOut/b就是利用out这个输出参数而返回的值 static int OutValue(

24、int a,out char b)b=(char)a;return 9;static void Main()int t=65,r;char m;r=OutValue(t,out m);Console.WriteLine(r=0,m=1,r,m);,运行结果如下:,注意:在把引用型实参的值传递给形参之前,必须先对其赋值。这一点是引用参数与输出参数的不同之处。在带有引用参数的方法中,有可能导致多个变量名指向同一内存地址,从而导致出错。,6.4.2 方法的重载,类中两个以上的方法(包括隐藏的继承而来的方法)取的名字相同,只要使用的参数类型或参数个数不同,编译器便知道在何种情况下应该调用哪个方法,这就

25、叫做方法的重载。方法重载必须遵守一个重要的约束:每一个被重载方法的参数类型或个数必须不同。当调用重载方法时,将执行形参与实参相匹配的那个方法。,例:方法重载。using System;class TestoverLoad public void print(int i)Console.WriteLine(输出的整数=0,i);public void print(string s)Console.WriteLine(输出的字符串=0,s);public void print(double d)Console.WriteLine(输出的双精度数=0,d);class test public sta

26、tic void Main()TestoverLoad app=new TestoverLoad();app.print(6);app.print(理解方法重载了吗?);app.print(3.14);,运行结果为:输出的整数=6 输出的字符串=理解方法重载了吗?输出的双精度数=3.14,6.4.4 静态方法与非静态方法 类的成员类型有静态和非静态两种,因此方法也有静态方法和非静态方法两种。使用static 修饰符的方法称为静态方法,没有使用static 修饰符的方法称为非静态方法。静态方法和非静态方法的区别是:静态方法属于类所有,非静态方法属于用该类定义的对象所有。,例:使用静态方法和非静态

27、方法。using System;class TestMethod public int a;static public int b;void Fun1()/定义一个非静态方法 a=10;/正确,直接访问非静态成员 b=20;/正确,直接访问静态成员 static void Fun2()/定义一个静态成员方法 a=10;/错误,不能访问非静态成员 b=20;/正确,可以访问静态成员,相当于myClass.b=20 class Teststatic void Main()myClass A=new myClass();A.a=10;/正确,访问类myClass的非静态公有成员变量 A.b=10;/

28、错误,不能直接访问类中静态公有成员 MyClass.a=20;/错误,不能通过类访问类中非静态公有成员 MyClass.b=20;/正确,可以通过类访问类myClass中的/静态公有成员,6.4.5 运算符的重载,为类定义自己的运算符的操作,就称为运算符重载。1运算符重载的声明 C#中运算符重载总是在类进行声明。实际上一个运算符重载不过是一个方法罢了,比较特别的是它的名称需要遵守一个特殊的格式来定义。所有的重载运算符的名称都是以operator开始,加上欲重载的运算符,而且重载运算符的方法一定是public且为static的。声明重载运算符的一般格式如下:public static 返回类型

29、operator 运算符(参数列表)/可执行语句,C#中下列运算符都是可以重载的:一元运算符:+-!+-true false 二元运算符:+-*/%&|=!=和=同样如此。同样,true与false也必须成对出现。C#中还有一些运算符是允许重载的,如下所示:=&?:new typeof sizeof is,2一元运算符重载 一元运算符重载必须使用类T的单个参数,其中+、-、!可以返回任何类型;+或-的返回类型必须是类T,而且重载之后的+或-无法区分前缀与后缀;true和false要求返回类型是布尔类型。3二元运算符重载 二元运算符重载必须有两个参数,而且其中至少一个必须是声明运算符的类类型。一

30、个二元运算符可以返回任何类型。,6.4.6 递归,类方法成员间允许相互调用,也可以自己调用自己。类的方法如果在方法体内直接或间接地自己调用自己就称为递归方法。递归是常用的程序设计技术,其基本思想就是“自己调用自己”。递归方法实际上体现了“依此类推”、“用同样的步骤重复”这样的思想,它可以用简单的程序来解决某些复杂的计算问题。递归调用在完成阶乘运算、级数运算、幂指数运算等方面特别有效。在执行递归操作时,C#语言把递归过程中的信息保存在堆栈中。如果无限循环地递归,或者递归次数太多,则产生“堆栈溢出”错误。,例:用递归方法求阶乘。利用的数学公式为n!=n*(n-1)!。当n=0时,n!=1。代码如下

31、:public long F(long n)if(n=0|n=1)return 1;else return n*F(n-1);,6.5 属性6.5.1 属性的声明 格式:属性修饰符 属性的类型 属性名称方法声明 说明:若属性是静态成员,通过“类名.属性成员名”访问;若属性是非静态成员,通过“对象名.属性成员名”访问。通过访问器,类的属性成员可以返回一个值(get访问器),或者接受外界通过赋值语句提供的值(set访问器)。,get访问器 格式:get 语句 说明:get访问器中的语句主要是用return语句返回某一个变量成员的值。例:class Circle protected int page

32、=2;public int pa get return page;class Test static void Main()Circle MyCircle=new Circle();int n=MyCircle.pa*10;/读pa属性 int m=MyCircle.page*10;/错误!Page是protected,set访问器 格式:set 语句 说明:set访问器用于外界写入的值。set访问器就像带有一个参数的方法,这个参数的名字是value(注意:参数value是隐含的,不能再定义),它的值就是调用者要写入属性的值。例:class Circle protected int page;

33、public int pa get return page;set page=value;class Test static void Main()Circle MyCircle=new Circle();MyCircle.pa=10;/对pa属性进行写操作 int n=MyCircle.pa*10;/读pa属性 Console.WriteLine(“n=0”,n);,运行结果如下:,通过属性来设置变量成员的值,可以在访问器中加入代码,以判断数据的合法性。例:以下是使用条件运算符进行运算,从而保证类ClassA的nIndex不为负数。class A private int nIndex;pub

34、lic int Index get return nIndex;set nIndex=value=0?value:0;,class Teststatic void Main()A p=new A();p.Index=-9;Console.WriteLine(p.Index);,运行结果如下:,属性定义可以包含get和set两个访问器的定义,也可以只包含其中的一个。根据get和set访问器的存在或不存在,属性按下面特征进行分类:.既包括get访问器也包括set访问器的属性被称为读写 属性。.只包括get访问器的属性被称为只读属性。一个只读 属性被赋值是错误的。.只包括set访问器的属性被称为只写

35、属性。,属性与变量都可以用来表示事物的状态,但属性可以实现只写或只读并且可以对用户指定的值(value)进行有效性检查,从而保证只有正确的状态才会得到设置,而变量不能。所以,在C#中一般采取以下原则:(1)若在类的内部记录事物的状态信息,则用变量。(2)变量一般用private修饰,以防止对外使用。(3)对外公布事物的状态信息,则使用属性。(4)属性一般与某个或某几个变量有对应关系。,索引器是这样一个成员:它能够让对象以类似数组的方式来访问,即可以使对象能用下标来得到一个值,它以访问数组的方法来访问类的数据成员,而实际的读/写操作则是通过get和set来完成的。6.6.1 索引的定义与使用 格

36、式:修饰符 类型名 this参数列表 set get 说明:在set方法中,可以使用一个特殊变量value,用以表示用户指定的值,而get方法使用return返回所得到的值。,6.6 索引指示器,例:定义索引指示器,class MyIndexer private string myArray=new string4;public string thisint index get if(index=4)return null;else return myArrayindex;set if(!(index=4)myArrayindex=value;注意:属性可以是静态成员,而索引指示器只能是实例成

37、员。,6.6.2 使用索引指示器访问对象 使用索引指示器,可以像数组一样访问类的对象,只不过通过数组下标访问的是存储在数组中的数组元素,而索引指示器访问的是类的对象。使用“常规的”C#数组,下标数字必须是整型值。索引器的一个优点就是程序员可以定义整型和非整型两种下标。,例:using System;class Index string name=new stringA,B,C,D;int i;public int thisstring idx get for(i=0;iname.Length;i+)if(idx=namei)break;if(i=name.Length)return-1;els

38、e return i+1;static void Main()Index a=new Index();if(aA!=-1)Console.WriteLine(字符A是序列中的第0个字符,aA);else Console.WriteLine(序列中没有该字符);,运行结果如下:,委托,顾名思义,就是中间代理人的意思。通俗地说,委托是一个可以引用方法的对象,即是说委托可以调用它所指向的方法。事件是建立在委托基础上的另一个重要特性。从本质上说,事件就是当某个事情发生时,会自动去执行一些语句。事件是特殊化的委托,委托是事件的基础。,6.7 委托和事件,6.7.1 委托 C#中使用委托的具体的步骤是:(

39、1)声明一个委托,其参数形式一定要和想要 包含的方法的参数形式一致。(2)定义所有你要定义的方法,其参数形式和 第一步中声明的委托对象的参数形式必须 相同。(3)创建委托对象并将所希望的方法包含在该 委托对象中。(4)通过委托对象调用包含在其中的各个方法。,步骤1:声明一个委托 格式:修饰符 delegate 返回类型 委托名(参数列表);例:委托的声明 public delegate void MyDelegate1(string input);public delegate double MyDelegate2();声明一个委托的对象,与声明一个普通类对象的方式一样:委托名 委托对象名;委

40、托对象的声明。MyDelegate1 a;MyDelegate2 b;,步骤2:定义方法,其参数形式和步骤1中声明的委托对象的必 须相同。例:定义方法class MyClass1 public void dMethod1(string input)Console.WriteLine(“Method1传递的参数是 0,input);public void dMethod2(string input)Console.WriteLine(Method1传递的参数是 0,input);,步骤3:创建一个委托对象并将上面的方法包含其中 例:在委托对象中包含方法。MyClass1 c2=new MyCla

41、ss1();MyDelegate1 d1;d1=new MyDelegate1(c2.dMethod1);MyDelegate1 d2=new MyDelegate1(c2.dMethod2);步骤4:通过委托对象调用包含在其中的方法。例:调用委托对象包含的方法。d1(abc);d2(123);,下面这个例子就是将上面的4个步骤合在一起:using System;public delegate void MyDelegate1(string input);class MyClass1 public void dMethod1(string input)Console.WriteLine(dMe

42、thod1传递的参数是 0,input);public void dMethod2(string input)Console.WriteLine(dMethod2传递的参数是 0,input);class Driver static void Main()MyClass1 c2=new MyClass1();?MyDelegate1 d1=new MyDelegate1(c2.dMethod1);?MyDelegate1 d2=new MyDelegate1(c2.dMethod2);?d1(abc);d2(123);,运行结果如下:,委托是可以合并的,又称为多播(Multicast)。合并的

43、委托实际上是对多个方法的调用,对这样的委托的调用,实际上是对所包装的各个方法的全部调用,其中的多个方法又称为该委托的调用列表。对于多个相同类型的委托,可以用加号运算符“+”进行调用列表的合并,可以用减号运算符“-”移除其调用列表中的方法。委托加减运算后的结果,如果其中不包含方法,则结果为null。例:strMod a=new strMod(DelegTest.reSpace);strMod b=new strMod(DelegTest.delSpace);strMod c=a+b;c(“How are you!”);/先调用reSpace()方法,再调用delSpace()方法 c-=a;c-

44、=b;/这时c的值为null,6.7.2 事件 事件是建立在委托基础上的另一个重要特性。其工作过程如下:关心某事件的对象向事件中注册事件处理程序,当事件发生时,会调用所有已注册的事件处理程序。事件处理程序要用委托来表示。,事件的声明 事件是类成员,以关键字event 声明。格式:修饰符 event 委托名 事件名;例:delegate void MyEventHandler();事件变量的声明为:class MyEvent public event MyEventHandler activate;/activate就是一个事件名,2.事件的预订与撤消 事件的预订就是向委托的调用列表中添加方法,

45、是通过为事件加上运算符+=来实现的。格式:事件名+=new 委托名(方法名);例:MyEvent evt=new MyEvent();evt.activate+=new MyEventHandler(handler);又例:OkButton.Click+=new EventHandler(OkButtonClick);这样,只要事件被触发,所预定的方法就会被调用。事件的撤消则采用运算符-=来实现:格式:事件名-=new 委托名(方法名);例:OkButton.Click-=new EventHandler(OkButtonClick);,事件的发生 就是委托的调用列表中的所包含的各个方法的调用

46、。格式:事件名(参数);,例:演示事件的声明、事件的预订及撤销、事件的发生。using System;delegate void MyEventHandler();/为事件建立一个委托class MyEvent public event MyEventHandler activate;/声明一个事件 public void fire()/调用这个方法来触发事件 if(activate!=null)activate();/触发事件 class Test static void handler()Console.WriteLine(事件发生);static void Main()MyEvent e

47、vt=new MyEvent();/把方法handler()添加到事件列表中 evt.activate+=new MyEventHandler(handler);evt.fire();/调用触发事件的方法,C#语言中允许各种委托应用于事件中,但在典型的应用中,委托的常用格式如下:delegate void 委托名(object sender,EventArgs e);其中,返回类型为void,委托名中有两个参数,分别表示事件的发出者及事件发生时的一些参数,这种典型的情况广泛应用于窗体中处理各种事件。,例:事件的典型应用 public delegate void EventHandler(object sender,EventArgs e)public event EventHandler Click;Button okButton=new Button();okButton.Click+=new EventHandler(okButton_Click);void okButton_Click(object sender,EventArgs e),本章作业:1.习题6的1、2、3、4、5、6、7。,实验报告:实验五,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号