第4章1 面向对象编程技术.ppt_第1页
第4章1 面向对象编程技术.ppt_第2页
第4章1 面向对象编程技术.ppt_第3页
第4章1 面向对象编程技术.ppt_第4页
第4章1 面向对象编程技术.ppt_第5页
已阅读5页,还剩83页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、在C#中实现面向对象的概念,第4章,2,目标,理解 C# 的类和对象 使用 C# 构造函数和析构函数 使用 C# 访问修饰符 使用方法 理解命名空间,3,1.对象:是具有属性和操作(方法)的实体。 对象的属性表示它所处的状态; 对象的操作(行为)用来改变对象的状态达到特定的功能。 对象有一个唯一的标识名以区别于其他对象,对象有固定的对外接口,它是对象与外界通信的通道。,4.1 类和对象4.1.1 类和对象概述,4,2、类,类(class):是对具有相同特征的一类事物所做的抽象(或者说,归纳)。 类的属性:说明了这个类的特点。 类的方法(method)代表了一类事物所具备的动作,是对属性的操作。

2、比如:“石英钟”类的方法有:秒针前进一格、分秒针前进一格、时针前进一格等,而“录像机”类所具备的方法可以有:播放、定格、录像、倒带、快进等。 类是一种数据类型,在C#中,类分为两种: 由系统提供的预先定义的,这些类在.NET框架类库中; 用户定义数据类型。,5,3、类和对象的关系,类和对象的关系 类是对象的抽象,对象则是类的具体化,是类的实例。 在创建对象之前必须先定义该对象所属的类。然后由类声明对象。 在Visual Studio.NET集成环境中的,工具箱中的控件,是被图形文字化的可视的类,而把这些控件添加到窗体设计器中后,窗体设计器中的控件则是对象,即由工具箱中的类创建的对象。,6,4.

3、1.2 类定义,类定义格式: 访问修饰符 class :基类类名 / 类的主体 ,示例: class Student / 类的主体 ,/ 字段 / 方法,说明: class 是声明类的关键字,class 类名和类体是必选项。 “类名”是一个合法的C#标识符,表示数据类型(类类型)名称,“类体”以一对大括号开始和结束。在一对大括号后面可以跟一个分号,也可以省略分号。 类修饰符(包括new、public、protected、internal、private、abstract和sealed)C#默认的修饰符是internal. 类体主要包括“字段”、“属性”、“方法”与“构造函数”。 类的定义位置不

4、限定。,7,class Student /定义了一个名为“Student”(学生)的类 public string id; /学号字段 public string name; /姓名字段 public string sex; /性别字段 public DateTime birthday;/出生日期字段 public string Details() /获得学生详细信息方法 return id+ “,”+name+ “,”+sex+,birthday.ToString(); ,例1:定义一个学生类,8,类体组成,“类体”包括类中的所有数据及对数据的操作,面向对象程序设计将数据与对数据的操作作为一

5、个整体,以类的形式进行定义,这种机制叫“封装”。 在“类体”中,所有的数据及对数据的操作的集合叫类成员,类成员的种类很多,主要包括“字段”、“属性”、“方法”与“构造函数”。 “字段”是类定义中的数据,也叫类的变量。如果需要在类定义的多个方法中使用某个变量,该变量应该声明为字段。 “属性”用于读取和写入“字段”值,“属性”是字段的自然扩展,对用户而言,“属性”等同于“字段”本身,对程序员而言,属性是一种读写“字段”的特殊方法。 “方法”实质上就是函数,通常用于对字段进行计算和操作,即对类中的数据进行操作,以实现特定的功能。,9,4.1.3 声明与使用对象,1. 声明对象 声明格式: 类名 对象

6、名; 例如:Student s1; / 声明一个学生类对象s1 实例化格式: 对象名=new 类名( ); 例如:s1=new Student( ); / 为s1分配内存,10,2. 访问对象,访问对象实质是访问对象成员,对对象变量成员的访问使用“.”运算符。 例如: s1.id=2005001; =张三; s1.sex=女; 使用对象变量为另一对象变量整体赋值, 例如,“Student s2;s2=s1;” 或“Student s2= s1;”。 可以使用对象中的某一成员为变量赋值。 例如:string sName=;,11,例1:定义一个学生类,在窗体中创建学生

7、对象,步骤1:创建Student类 步骤2:设计窗体 步骤3:编写代码对Student类进行实例化,12,创建学生按钮代码:,private void btnCreateStudent_Click(object sender, EventArgs e) /字段变量为public Student std = new Student(); std.id = txtid.Text; = txtname.Text; std.sex = txtsex.Text; std.birthday = DateTime.Parse(txtbirthday.Text); MessageBox.Sh

8、ow(std.Details() ); ,13,4.1.4访问控制,14,访问修饰符,Teacher 类,private 成员,protected 成员,public 成员,internal 成员,Student 类,只有 Student 类在 Teacher 类都在同一程序集中,才可访问internal成员,不可访问,不可访问,可以访问,15,4.2属性4.2.1声明属性,1、属性用于读取和写入“字段”值 2、属性创建步骤: 声明一个私有字段存储属性值 例:private string name; 编写一属性声明,为属性提供访问器 2.属性声明格式 访问修饰符 类型名 属性名 get set

9、 3.分类: 读写属性、只读属性,只写属性 实例属性和静态属性,16,读/写属性,访问修饰符 数据类型 属性名 get return 私有字段 ; set 私有字段value; ,可以赋值和检索值,说明:私有字段保存属性值,使其不被外界修改,17,例2:编写一个读写学生姓名的属性,class Student / 类名为Student private string name; / 声明字段 public string Name / 对应name的属性 get return name; set name=value; ,18,编写一个访问性别的属性,private bool sex; public

10、 string Sex get if (sex= true) return 男; else return 女; set if (value = 男) sex= true; else sex= false; ,19,只读属性,访问修饰符 数据类型 属性名 get ; ,只能检索值,20,编写一个访问年龄的只读属性,private DateTime birthday; public int Old get return DateTime.Now.Year - birthday.Year; ,21,只写属性,访问修饰符 数据类型 属性名 set ; ,只能赋值,22,编写一个输入出生日期的只写属性,

11、private DateTime birthday; public DateTime Birthday set birthday=value; ,23,4.2.2 使用属性,属性成员的使用就如同公有数据成员的使用一样。可以为可写的属性赋值,可以用可读的属性为其他变量赋值。 例:Student s1=new Student( ); / 用属性设置修改数据成员值 s1.Id=2005003; s1.Name=李四; s1.Sex=男; / 用属性读取数据成员值为其他变量赋值 sting ssex=s1.Sex;,24,4.3 方法,方法是把一些相关的语句组织在一起,用于解决某一特定问题的语句块。方

12、法必须放在类定义中。方法同样遵循先声明后使用的规则。 C#语言中的方法相当于其他编程语言C语言中的函数过程。 C#中的方法必须放在类定义中声明,也就是说,方法必须是某一个类的方法。,25,1、声明方法,语法,访问修饰符(可选),默认情况下为 private,访问修饰符 返回类型 (参数列表) / 方法主体 /return 表达式 ,如果不需要返回任何值,方法可能返回 void 数据类型,例:获得学生详细信息方法 public string Details() return id+ “,”+name+ “,”+sex; ,如果有返回值,方法通过return返回 表达式的值,26,2、调用方法,语

13、法,对象名.方法名(参数列表);,实例,类中的方法,点号,例:Student S1 = new Student(); MessageBox.Show( S1.Details();,27,例1:在学生类中增加一个Create方法对学号、姓名、性别赋值的方法,public void Create(string id, string name, string sex) this.id = id; = name; this.sex = sex; ,28,例2:编写一个能实现复数加法的类,1、创建实部和虚部两个字段. 2、创建一个产生复数的方法 3、编写一个返回完整复数的方法; 4、

14、编写一个实现两个复数相加的方法 5、设计以下窗体对复数类进行实例化,29,演示:示例 3,复数类设计,class ComplexNumber private int _real, _imaginary; public void Create(int a,int b) _real = a; _imaginary = b; public string PrintResult() return(_real + + + _imaginary + i); / 此方法用于将两个复数相加 public ComplexNumber ComplexAdd(ComplexNumber Param1) Param1

15、._real += _real; Param1._imaginary += _imaginary; return Param1; ,接收实部和虚部的值,返回实部和虚部的值,Param1 与 Number2 相关联,30,复数类的实例化,private void button2_Click(object sender, EventArgs e) ComplexNumber Number1 = new ComplexNumber(); ComplexNumber Number2 = new ComplexNumber(); Number1.Create(int.Parse(textBox1.Tex

16、t),int.Parse(textBox2.Text); Number2.Create(int.Parse(textBox3.Text),int.Parse(textBox4.Text); ComplexNumber Temp = Number1.ComplexAdd(Number2); MessageBox.Show(两个复数之和为:+Temp.PrintResult(); ,31,4.3.2方法参数,值参数。重新分配内存空间。 引用参数ref。别名,不重新分配内存空间,调用的时候要加上ref。 输出参数out。希望有多个返回值。也是不重新分配内存,调用加out 参数数组params。允许向

17、函数传递个数变化的参数。该参数数组必须位于参数列表的最后而且他必须是一维的。不能和 ref和out组和起来用。,32,值参数,class Class1 static void swap(int a,int b) int t; t=a; a=b; b=t; static void Main(string args) int x=10,y=20; Console.WriteLine(x=0,y=1,x,y); swap(x,y); Console.WriteLine(x=0,y=1,x,y); 说明:值参数重新分配内存空间。,Main(),Swap(),33,引用参数ref,class Class

18、1 static void swap(ref int a,ref int b) int t; t=a; a=b; b=t; static void Main(string args) int x=10,y=20; Console.WriteLine(x=0,y=1,x,y); swap(ref x,ref y); Console.WriteLine(x=0,y=1,x,y); 说明:引用参数不重新分配内存空间,调用的时候要加上ref。,Main(),Swap(),托管堆,8088,8089,34,输出参数out,static int outadd(out int a, out int b)/o

19、ut参数传递 int t; a = 30; b = 40; t = a + b; return t; static void Main(string args) int x, y; int t = outadd(out x,out y);/调用out参数传递方法 Console.WriteLine(x=0,y=1,x+y=2, x, y, t); 说明:out参数传递类似ref参数传递,但必须在被调方法中对参数进行初始化。而ref参数则必须在调用函数之前进行初始化。,35,可变数量参数params,class Class1 static int MutiParams(params int va

20、r) int s = 0; for (int i = 0; i var.Length; i+) vari = vari + 10; s += vari; return s; static void Main(string args) int arr = 10, 20, 30 ; int sum1 = MutiParams(arr,a); Console.WriteLine(调用后的arr0为:0, arr0); Console.WriteLine(调用后的sum1为:0, sum1); int sum2 = MutiParams(100, 200); Console.WriteLine(调用后

21、的sum2为:0, sum2); int sum3 = MutiParams(); Console.WriteLine(调用后的sum3为:0, sum3); ,参数数组params。允许向函数传递个数变化的参数。该参数数组必须位于参数列表的最后而且他必须是一维的。不能和 ref和out组合起来用。,36,数组传递和字符串传递,数组传递类似于ref参数传递 字符串传递类似于值传递 例: class Class1 static void setstring(string str,int arr) str=bye-bye; arr0=23; static void Main(string args

22、) int arr=1,2,3; string s=hello world; setstring(s,arr); Console.WriteLine(s+,arr0=+arr0); ,运行结果: Hello world,arr0=23”,37,4.3.3 重载方法,方法重载是声明两个以上的同名方法,实现对不同数据类型的相同处理。 方法重载有两点要求: 重载的方法名称必须相同; 重载的方法,其形参个数或类型必须不同,否则将出现“已经定义了一个具有相同类型参数的方法成员”的编译错误。 例如能同时处理整型与浮点型数据的重载方法: public void Swap(ref int a,ref int

23、b) public void Swap(ref float a,ref float b),38,方法的参数个数不同,具有不同数量的参数的方法重载,39,参数数据类型不同,int smallest(int numbers) int min = numbers0; for(int i = 1;i numbersi) min = numbersi; return min; double smallest(double numbers) double min = numbers0; for(int i = 1;i numbersi) min = numbersi; return min; ,具有不同类

24、型的参数的方法重载,40,练习,在学生类中添加两个方法,一个是只对学生的学号赋值,一个是对学号、姓名、性别赋值。 并在窗体中进行以下改进: 若只输入了学号,就调用只对学生的学号赋值的方法。 若都输入了,就调用对学号、姓名、性别赋值的方法。,41,学生类中的两种重载方法,/只对学生的学号赋值方法 public void Create(string id) this.id = id; /对学号、姓名、性别赋值的方法。 public void Create(string id, string name, string sex) this.id = id; = name; this

25、.sex = sex; ,42,4.4 构造函数,构造函数是一种特殊的方法成员,构造函数的主要作用是在创建对象(声明对象)时初始化对象。 一个类定义必须且至少有一个构造函数,如果定义类时,没有声明构造函数,系统会提供一个默认的构造函数,如果声明了构造函数,系统将不再提供默认构造函数。,43,4.4.1 声明构造函数,声明构造函数与声明普通方法相比,有两个特别要求, 一是构造函数不允许有返回类型包括void类型, 二是构造函数的名称必须与类名相同。 所以构造函数往往需要使用形参,例如创建一个学生类对象时,需要给出学生的学号、姓名、性别及年龄等,所以学生类构造函数可以声明如下: public St

26、udent(string ID,string nname,string) id=ID; name=nname; sex=ssex;,44,构造函数的自动调用,创建对象时,将自动调用构造函数 创建对象时须按照声明的构造函数的参数要求给出实际参数,否则将产生编译错误,例如: Student s1=new Student(“2005001”,“张三”,“女”); 由上述创建对象的语句可知,new关键字后面实际是对构造函数的调用。,45,4.4.2 重载构造函数,例如为学生类重载一个只初始化姓名的构造函数,代码如下: public Student(string nname) name=nname; 如

27、果在声明了带参数的构造函数后,还想保留默认构造函数,则必须显式声明一个默认构造函数。 以Student类为例,声明默认构造函数如下: public Student( ) / 显式声明默认构造函数,46,补充:析构函数,是用于执行清除操作的特殊方法 析构函数的名字与类名相同,但前面要加一个” 析构函数无修饰符,不带参数,也没有返回值 当撤销对象的时候,自动调用析构函数 析构函数不能被继承,也不能被重载,()0, / 析构函数的主体 ,语法:, Student() ,示例:,47,举例:修改学生信息,学生创建后,单击修改按钮,则打开另一个窗体,修改此学生的信息,修改以后的学生信息可以显示创建学生信

28、息的窗体中,48,操作步骤,1)创建两个窗体FrmStudentAdd.cs和FrmStudentModi.cs 2)编写FrmModiStudent.cs构造函数和Load事件代码,49,编写保存按钮的代码,50,编写FrmStudentAdd窗体修改学生按钮的代码,51,4.5 静态成员,类可以具有静态成员,例如静态字段、静态方法、静态构造函数、静态属性等。 静态成员与非静态(实例)成员的不同在于: 静态成员属于类,为这个类的所有实例所共享. 非静态成员则总是与特定的实例(对象)相联系。 声明静态成员需要使用static修饰符。,52,4.5.1静态成员和实例成员,用Static修饰符声明

29、成员的时候,得到的是静态成员,静态成员属于整个类所有,为这个类的所有实例所共享.包括方法和属性 例: public static int count;/静态数据成员 不用Static修饰的成员是实例成员,实例成员属于类的实例 例:public string name;/数据成员 访问格式: 类名.静态成员 例:Student. count 实例名.实例成员 例: student std1=new student(); std1. name,53,4.5.2静态方法,静态方法同样使用修饰符static声明, 静态方法属于类,只能使用类调用,不能使用对象调用。 静态方法与非静态方法一样可以重载。

30、静态方法只能访问类中的静态数据成员,访问非静态数据成员是错误的。 所有的Main()函数都是静态的。,54,4.5.3 C#中的常用类型转换静态方法,在C#的System命名空间中,有一个Convert(转换)类,该类提供了由字符串类型转换为相应其他基本数据类型的一系列静态方法。 类型转换方法最常用的调用格式之一是: Convert.静态方法名(字符串类型数据) 1. Convert.ToInt32方法 2. Convert.ToSingle方法 3. Convert.ToChar方法 4. Convert.ToBoolean方法,55,4.6this关键字,引用类的当前实例。他隐含于每一个类

31、的成员函数中 静态成员函数没有this指针。 常用用法: 限定被相似的名称隐藏的成员 将对象作为参数传递到其他方法 声明索引器,56,this限定被相似的名称隐藏的成员,public int no; public string name; public string _class; public student(int no, string name, string _class) this. no = no; this. name = name; this._class = _class; ,57,this将对象作为参数传递到其它方法。,class student /学生类 public D

32、ateTime birthday; /出生日期 public string name; /数据成员 public void setvalue() name=张华; birthday=DateTime.Parse(1985/12/12); public void printage() Console.WriteLine(0的年龄为1, name, age.calcage(this); class age /年龄类 public static int calcage(student s) int x; x =DateTime.Now.Year-s.birthday.Year; return(x);

33、 ,58,4.7索引器,索引器类似于类的属性,它使得对象可以像数组那样被方便、直观的引用。但索引器可以有参数列表,且只能作用在实例对象上,而不能在类上直接作用。 1.索引器声明格式: 类型1 this 类型2 索引 get; set; 说明:类型1 表示索引器属性返回值类型。 类型2 表示索引参数的类型,可为整型、字符串或其他类型。 This关键字是索引器所属对象的引用。 get和set与属性声明相同。 2.索引器访问格式: 对象 索引,59,举例:编写一个能实现能对一组学生进行操作的索引。,public class Studentarray Student stdarr;/ 该数组用于存放一

34、组学生信息 public Studentarray(int count) / 初始学生数组中的元素个数 stdarr = new Studentcount; public Student thisint index /创建带有int参数的Student索引器 get /验证索引范围 if(indexstdarr.Length) return null; return stdarrindex; / 对于有效索引,返回指定元素的学生 set if (index stdarr.Length) return ; stdarrindex = value; /给指定数组元素赋值 ,60,public St

35、udent thisstring name get foreach (Student i in stdarr) if (i._name=name) return i; return null; ,带有 string 参数的 Student 索引器,61,调用索引器举例,62,添加按钮代码,63,修改按钮代码,64,定义和调用索引器 4-1,演示,class Photo string _title; public Photo(string title) this._title = title; public string Title get return _title; ,以 Title 属性表

36、示照片,将照片存放于数组 photos 中,class Album / 该数组用于存放照片 Photo photos; public Album(int capacity) photos = new Photocapacity; ,65,定义和调用索引器 4-2,public Photo thisint index get / 验证索引范围 if (index = photos.Length) Console.WriteLine(索引无效); / 使用 null 指示失败 return null; / 对于有效索引,返回请求的照片 return photosindex; set if (ind

37、ex = photos.Length) Console.WriteLine(索引无效); return; photosindex = value; ,带有 int 参数的 Photo 索引器,读/写索引器,66,定义和调用索引器 4-3,public Photo thisstring title get / 遍历数组中的所有照片 foreach (Photo p in photos) / 将照片中的标题与索引器参数进行比较 if (p.Title = title) return p; Console.WriteLine(未找到); / 使用 null 指示失败 return null; ,带有

38、 string 参数的 Photo 索引器,只读索引器,67,定义和调用索引器 4-4,static void Main(string args) / 创建一个容量为 3 的相册 Album family = new Album(3); / 创建 3 张照片 Photo first = new Photo( Jeny ); Photo second = new Photo(Smith); Photo third = new Photo(“Lono); / 向相册加载照片 family0 = first; family1 = second; family2 = third; / 按索引检索 Ph

39、oto objPhoto1 = family2; Console.WriteLine(objPhoto1.Title); / 按名称检索 Photo objPhoto2 = family“Jeny; Console.WriteLine(objPhoto2.Title); ,68,委托和事件案例准备,69,4.8委托,委托属于引用类型,用于封装方法的引用,类似于C+的函数指针,以函数作为参数。 委托是完全面向对象的,是类型安全和可靠的。 委托是事件的基础 委托是“函数指针”在C#中的更好实现,事件是“回调函数”在C#中的更好实现。 使用委托的几个步骤:委托声明,委托实例化和委托调用,70,4.8

40、.1委托声明,格式: 修饰符 delegate 返回值类型 标识(形参列表) 例:public delegate double Mydelegate(double x); 说明: 修饰符可以是public,protected,internal,private,new. 返回值类型和形参列表为所引用方法的返回值类型和形参列表,而且形参列表的类型和顺序都要与所引用方法的形参相同。,using System; delegate void MyDg(); /声明委托 public class DelegateTest public void InstanceMethod() /实例方法 Console

41、.WriteLine(“委托实现方法测试); static public void StaticMethod() /静态方法 Console.WriteLine(“委托静态方法测试); ,71,4.8.2使用委托,在对委托进行了声明之后,就可以使用委托了。在C#中使用委托同使用一个普通的引用类型数据一样。 使用委托步骤: (1)首先使用new操作符创建一个委托实例,把委托指向要引用的方法。在实例中,可以封装一个静态方法,也可以封装一个非静态方法. 格式:委托类型名 委托实例new 委托类型名(方法) (2)应用委托的实例对象调用它指向的方法。,注意:如果委托声明不在类外部而在类的内部,比如有两

42、个类A和B,假定在类A的内部,那么在类B中对委托的引用就要加上类A的名称。,public class A public delegate int d(int i); /声明一个委托 public class B A.d d1=new A.d(y.InstanceMethod); ,72,1、创建方法声明委托,73,2、委托测试按钮事件代码,74,4.8.3多重委托,多重委托就是委托可调用多个方法。但是,这些方法形参相同,返回类型必须是void。 多重委托最常用的两个方法就是Combine()和Remove(): Combine()将不同的委托组合在一起,直接用加号运算符(“+”)来调用Comb

43、ine() Remove()则是从一个多重委托中除去一个委托。用减号运算符(“-”)来调用Remove()。,75,举例,using System; delegate void Dg(string s); class A public static void H(string str) Console.WriteLine(Hello,0!,str); public static void G(string str) Console.WriteLine(Goodbye,0!,str); class MyClass public static void Main() Dg a,b,c,d; /声明

44、四个委托实例对象 a=new Dg(A.H); /实例对象a指向类A的方法H b=new Dg(A.G); /实例对象b指向类A的方法G c=a+b; /通过加号创建多重委托 d=c-a; /使用减号把委托a从多重委托中移出 a(A);b(B);c(C);d(D);Console.Read(); ,运行结果: Hello,A! Goodbye,B! Hello,C! Goodbye,C! Goodbye,D!,76,事件,“请听题”,集中注意力聆听,其他人,事件源,事件的发布者,事件的订阅人,不关心,未订阅该事件,定义事件 为对象订阅该事件 将发生的事件通知给订阅人,77,4.9事件,事件是在

45、委托的基础上实现的一种通知机制。 事件最常见的用途是窗体编程,当发生单击按钮、移动鼠标等事件时,相应的程序将收到通知,再执行代码 事件就是对象之间发送的消息。 引发事件的对象叫事件发送方,捕获事件并对其作出响应的对象叫事件接受方。 委托作为发送方和接受方之间的一个纽带。 事件操作步骤: 事件声明 事件处理程序方法定义和事件的预定,78,1.事件声明,1)定义委托 格式:修饰符 delegate void 事件委托名(参数列表) 例:public delegate void EventHandler(object from , myEventArgs e) System.EventArgs是包含

46、事件数据的类的基类,在代码中可直接使用EventArgs类。 myEventArgs类派生于EventArgs类,实现自定义事件数据的功能。这里from表示发生事件的对象。 2)定义事件 格式: 修饰符 event 事件委托名 事件名 例:public event EventHandler TextOut; 3)事件的激活: 格式:if (事件名 != null) /可以省略if语句 事件名(参数列表); 例:if (TextOut != null) TextOut(this,new EventArgs(); /事件委托 class student public event scorechan

47、geEventHandler scorechange;/声明事件 private int std_score; public int score get return std_score; set if (scorechange != null)/检查scorechange事件有没有被订阅 scorechange(value); /触发事件 std_score = value; ,80,2.事件处理程序方法定义和事件的预定,1)定义事件处理方法 2)预定事件 实例化事件所在的类 预定事件:通过为事件加上左操作符“+=”来实现。 格式: 实例名.事件名+new EventHander(事件处理方

48、法名) 如:OKButton.Click+=new EventHandler(OKButtonClick); 这样,只要事件Click被触发,Button1Click事件处理方法就会调用,这里,EventHandler是一个委托类型。 说明: 撤消事件:采用左操作符“-=”来实现。 格式: 实例名.事件名new EventHander(事件处理方法名) 如: OkButton.Click-=new EventHandler(OkButtonClick);,81,事件处理,public partial class Form1 : Form public Form1() InitializeComponent(); private void button1_Click(object sender, EventArgs e) student std = new student(); /预定scorechange事件的处理程序为scorchangeprog std.scorechange +=new corechangeEvent

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论