《第4章1 面向对象编程技术.ppt》由会员分享,可在线阅读,更多相关《第4章1 面向对象编程技术.ppt(88页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、ZJWCHC在在C#中实现面向对象的概念中实现面向对象的概念第第4章章目标目标理解理解 C#的类和对象的类和对象使用使用 C#构造函数和析构函数构造函数和析构函数使用使用 C#访问修饰符访问修饰符使用方法使用方法理解命名空间理解命名空间21.对象对象:是具有属性和操作(方法)的实体。是具有属性和操作(方法)的实体。p对象的属性表示它所处的状态;对象的属性表示它所处的状态;p对象的操作(行为)用来改变对象的状态达对象的操作(行为)用来改变对象的状态达到特定的功能。到特定的功能。p对象有一个唯一的标识名以区别于其他对象,对象有一个唯一的标识名以区别于其他对象,对象有固定的对外接口,它是对象与外界通
2、对象有固定的对外接口,它是对象与外界通信的通道。信的通道。4.1 类和对象类和对象4.1.1 类和对象概述类和对象概述32、类、类类(类(class):是对具有相同特征的一类事物所做的抽象是对具有相同特征的一类事物所做的抽象(或者说,归纳)。(或者说,归纳)。类的属性:说明了这个类的特点。类的属性:说明了这个类的特点。类的方法(类的方法(method)代表了一类事物所具备的动作,代表了一类事物所具备的动作,是对属性的操作。比如:是对属性的操作。比如:“石英钟石英钟”类的方法有:秒针类的方法有:秒针前进一格、分秒针前进一格、时针前进一格等,而前进一格、分秒针前进一格、时针前进一格等,而“录录像机
3、像机”类所具备的方法可以有:播放、定格、录像、倒类所具备的方法可以有:播放、定格、录像、倒带、快进等。带、快进等。类是一种数据类型,在类是一种数据类型,在C#中,类分为两种:中,类分为两种:由系统提供的预先定义的,这些类在由系统提供的预先定义的,这些类在.NET框架类库中;框架类库中;用户定义数据类型。用户定义数据类型。43、类和对象的关系、类和对象的关系类和对象的关系类和对象的关系 类是对象的抽象,对象则是类的具体类是对象的抽象,对象则是类的具体化,是类的实例。化,是类的实例。在创建对象之前必须先定义该对象所属的类。然后由类在创建对象之前必须先定义该对象所属的类。然后由类声明对象。声明对象。
4、在在Visual Studio.NET集成环境中的,工具箱中的控集成环境中的,工具箱中的控件,是被图形文字化的可视的类,而把这些控件添加到件,是被图形文字化的可视的类,而把这些控件添加到窗体设计器中后,窗体设计器中的控件则是对象,即由窗体设计器中后,窗体设计器中的控件则是对象,即由工具箱中的类创建的对象。工具箱中的类创建的对象。54.1.2 类定义类定义类定义格式:类定义格式:访问修饰符访问修饰符 class:基类类名 /类的主体类的主体示例:class Student /类的主体/字段/方法说明:说明:class 是声明类的关键字,是声明类的关键字,class 类名类名和和类体类体是必选项。
5、是必选项。“类名类名”是一个合法的是一个合法的C#标识符,表示数据类型(类类型)名称,标识符,表示数据类型(类类型)名称,“类体类体”以一对大括号开始和结束。在一对大括号后面可以跟一个以一对大括号开始和结束。在一对大括号后面可以跟一个分号,也可以省略分号。分号,也可以省略分号。类修饰符(包括类修饰符(包括new、public、protected、internal、private、abstract和和sealed)C#默认的修饰符是默认的修饰符是internal.类体主要包括类体主要包括“字段字段”、“属性属性”、“方法方法”与与“构造函数构造函数”。类的定义位置不限定。类的定义位置不限定。6c
6、lass Student /定义了一个名为定义了一个名为“Student”(学生)的类(学生)的类 public string id;/学号字段学号字段 public string name;/姓名字段姓名字段 public string sex;/性别字段性别字段 public DateTime birthday;/出生日期字段 public string Details()/获得学生详细信息方法获得学生详细信息方法 return id+“,”+name+“,”+sex+,birthday.ToString();例例1:定义一个学生类:定义一个学生类7类体组成类体组成“类体类体”包括类中的所
7、有数据及对数据的操作,面向包括类中的所有数据及对数据的操作,面向对象程序设计将数据与对数据的操作作为一个整体,对象程序设计将数据与对数据的操作作为一个整体,以类的形式进行定义,这种机制叫以类的形式进行定义,这种机制叫“封装封装”。在在“类体类体”中,所有的数据及对数据的操作的集合叫中,所有的数据及对数据的操作的集合叫类成员,类成员的种类很多,主要包括类成员,类成员的种类很多,主要包括“字段字段”、“属性属性”、“方法方法”与与“构造函数构造函数”。“字段字段”是类定义中的数据,也叫类的变量。如果是类定义中的数据,也叫类的变量。如果需要在类定义的多个方法中使用某个变量,该变量需要在类定义的多个方
8、法中使用某个变量,该变量应该声明为字段。应该声明为字段。“属性属性”用于读取和写入用于读取和写入“字段字段”值,值,“属性属性”是是字段的自然扩展,对用户而言,字段的自然扩展,对用户而言,“属性属性”等同于等同于“字段字段”本身,对程序员而言,属性是一种读写本身,对程序员而言,属性是一种读写“字字段段”的特殊方法。的特殊方法。“方法方法”实质上就是函数,通常用于对字段进行计实质上就是函数,通常用于对字段进行计算和操作,即对类中的数据进行操作,以实现特定算和操作,即对类中的数据进行操作,以实现特定的功能。的功能。84.1.3 声明与使用对象声明与使用对象1.声明对象声明格式:声明格式:类名 对象
9、名;例如:例如:Student s1;/声明一个学生类对象声明一个学生类对象s1实例化格式:实例化格式:对象名=new 类名();例如:例如:s1=new Student();/为为s1分配内存分配内存92.访问对象访问对象实质是访问对象成员,对对象变量成员的访访问对象实质是访问对象成员,对对象变量成员的访问使用问使用“.”运算符。运算符。例如:例如:s1.id=2005001;s1.name=张三张三;s1.sex=女女;使用对象变量为另一对象变量整体赋值,使用对象变量为另一对象变量整体赋值,例如,例如,“Student s2;s2=s1;”或或“Student s2=s1;”。可以使用对象
10、中的某一成员为变量赋值。可以使用对象中的某一成员为变量赋值。例如:例如:string sName=s1.name;10例例1:定义一个学生类,在窗体中创建学生对象:定义一个学生类,在窗体中创建学生对象步骤步骤1:创建:创建Student类类步骤步骤2:设计窗体:设计窗体步骤步骤3:编写代码对:编写代码对Student类进行实例化类进行实例化11创建学生按钮代码:创建学生按钮代码:private void btnCreateStudent_Click(object sender,EventArgs e)/字段变量为字段变量为public Student std=new Student();std
11、.id=txtid.Text;std.name=txtname.Text;std.sex=txtsex.Text;std.birthday=DateTime.Parse(txtbirthday.Text);MessageBox.Show(std.Details();124.1.4访问控制修饰符说明public访问不受限制,可以被任何其他类访问访问不受限制,可以被任何其他类访问internal当前程序集可以访问private只有所属类的成员才能访问(默认值)protected所属类或派生自所属类的类型可以访问13访问修饰符访问修饰符Teacher 类private 成员protected 成员p
12、ublic 成员internal 成员Student 类只有 Student 类在 Teacher 类都在同一程序集中,才可访问internal成员不可访问不可访问可以访问144.2属性属性4.2.1声明属性声明属性1、属性用于读取和写入、属性用于读取和写入“字段字段”值值2、属性创建步骤:、属性创建步骤:声明一个私有字段存储属性值声明一个私有字段存储属性值 例:例:private string name;编写一属性声明,为属性提供访问器编写一属性声明,为属性提供访问器2.属性声明格式属性声明格式访问修饰符访问修饰符 类型名类型名 属性名属性名 get set 3.分类:分类:读写属性、只读属
13、性,只写属性读写属性、只读属性,只写属性实例属性和静态属性实例属性和静态属性15读/写属性 访问修饰符 数据类型 属性名 get return 私有字段;set 私有字段value;可以赋值和检索值p说明:私有字段保存属性值,使其不被外界修改16例例2:编写一个读写学生姓名的属性:编写一个读写学生姓名的属性class Student /类名为类名为Student private string name;/声明字段声明字段 public string Name /对应对应name的属性的属性 get return name;set name=value;17编写一个访问性别的属性编写一个访问性别
14、的属性private bool sex;public string Sex get if(sex=true)return 男男;else return 女女;set if(value=男男)sex=true;else sex=false;18只读属性访问修饰符 数据类型 属性名get;只能检索值19编写一个访问年龄的只读属性编写一个访问年龄的只读属性 private DateTime birthday;public int Old get return DateTime.Now.Year-birthday.Year;20只写属性访问修饰符 数据类型 属性名set;只能赋值21编写一个输入出生日
15、期的只写属性编写一个输入出生日期的只写属性private DateTime birthday;public DateTime Birthday set birthday=value;224.2.2 使用属性属性成员的使用就如同公有数据成员的使用一样。可属性成员的使用就如同公有数据成员的使用一样。可以为可写的属性赋值,可以用可读的属性为其他变量以为可写的属性赋值,可以用可读的属性为其他变量赋值。赋值。例:例:Student s1=new Student();/用属性设置修改数据成员值用属性设置修改数据成员值 s1.Id=2005003;s1.Name=李四李四;s1.Sex=男男;/用属性读取数
16、据成员值为其他变量赋值用属性读取数据成员值为其他变量赋值 sting ssex=s1.Sex;234.3 方法方法是把一些相关的语句组织在一起,用于解方法是把一些相关的语句组织在一起,用于解决某一特定问题的语句块。方法必须放在类定决某一特定问题的语句块。方法必须放在类定义中。方法同样遵循先声明后使用的规则。义中。方法同样遵循先声明后使用的规则。C#语言中的方法相当于其他编程语言语言中的方法相当于其他编程语言C语言中语言中的函数过程。的函数过程。C#中的方法必须放在类定义中声明,也就是中的方法必须放在类定义中声明,也就是说,方法必须是某一个类的方法。说,方法必须是某一个类的方法。241、声明方法
17、、声明方法语法访问修饰符(可选),默认情况下为 private访问修饰符 返回类型(参数列表)/方法主体/return 表达式如果不需要返回任何值,方法可能返回 void 数据类型例:获得学生详细信息方法public string Details()return id+“,”+name+“,”+sex;如果有返回值,方法通过return返回 表达式的值252、调用方法、调用方法语法对象名.方法名(参数列表);实例类中的方法点号例:例:Student S1=new Student();MessageBox.Show(S1.Details();26例例1:在学生类中增加一个:在学生类中增加一个Cr
18、eate方法对学方法对学号、姓名、性别赋值的方法号、姓名、性别赋值的方法 public void Create(string id,string name,string sex)this.id=id;this.name=name;this.sex=sex;27例例2:编写一个能实现复数加法的类:编写一个能实现复数加法的类1、创建实部和虚部两个字段.2、创建一个产生复数的方法3、编写一个返回完整复数的方法;4、编写一个实现两个复数相加的方法5、设计以下窗体对复数类进行实例化28演示:示例 3复数类设计复数类设计 class ComplexNumber private int _real,_ima
19、ginary;public void Create(int a,int b)_real=a;_imaginary=b;public string PrintResult()return(_real+_imaginary+i);/此方法用于将两个复数相加 public ComplexNumber ComplexAdd(ComplexNumber Param1)Param1._real+=_real;Param1._imaginary+=_imaginary;return Param1;接收实部和虚部的值返回实部和虚部的值Param1 与 Number2 相关联29复数类的实例化复数类的实例化 p
20、rivate void button2_Click(object sender,EventArgs e)ComplexNumber Number1=new ComplexNumber();ComplexNumber Number2=new ComplexNumber();Number1.Create(int.Parse(textBox1.Text),int.Parse(textBox2.Text);Number2.Create(int.Parse(textBox3.Text),int.Parse(textBox4.Text);ComplexNumber Temp=Number1.Complex
21、Add(Number2);MessageBox.Show(两个复数之和为:两个复数之和为:+Temp.PrintResult();304.3.2方法参数方法参数值参数。重新分配内存空间。值参数。重新分配内存空间。引用参数引用参数ref。别名,不重新分配内存空间,调用别名,不重新分配内存空间,调用的时候要加上的时候要加上ref。输出参数输出参数out。希望有多个返回值。也是不重新希望有多个返回值。也是不重新分配内存,调用加分配内存,调用加out参数数组参数数组params。允许向函数传递个数变化的允许向函数传递个数变化的参数。该参数数组必须位于参数列表的最后而且参数。该参数数组必须位于参数列表的
22、最后而且他必须是一维的。不能和他必须是一维的。不能和 ref和和out组和起来用。组和起来用。31值参数值参数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);说明:说明:值参数重新分配内存空间。10201020Main()Swap()32引用参数引用参数refclass Class1 static
23、 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。8088808980888089Main()Swap()1020托管堆8088808933输出参数输出参数out static int outadd
24、(out int a,out int b)/out参数传递参数传递 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参数则必须在调用函数之前进行初始化。参数则必须在调用函数之前进行初始化。34
25、可变数量参数可变数量参数paramsclass Class1 static int MutiParams(params int var)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=
26、MutiParams(100,200);Console.WriteLine(调用后的调用后的sum2为:为:0,sum2);int sum3=MutiParams();Console.WriteLine(调用后的调用后的sum3为:为:0,sum3);参数数组参数数组params。允许允许向函数传递个数变化的参向函数传递个数变化的参数。该参数数组必须位于数。该参数数组必须位于参数列表的最后而且他必参数列表的最后而且他必须是一维的。不能和须是一维的。不能和 ref和和out组合起来用。组合起来用。35数组传递和字符串传递数组传递和字符串传递数组传递类似于数组传递类似于ref参数传递参数传递字符串
27、传递类似于值传递字符串传递类似于值传递例:例:class Class1 static void setstring(string str,int arr)str=bye-bye;arr0=23;static void Main(string args)int arr=1,2,3;string s=hello world;setstring(s,arr);Console.WriteLine(s+,arr0=+arr0);运行结果:Hello world,arr0=23”364.3.3 重载方法 方法重载是声明两个以上的同名方法,实现对不同数方法重载是声明两个以上的同名方法,实现对不同数据类型的相
28、同处理。据类型的相同处理。方法重载有两点要求:方法重载有两点要求:重载的方法名称必须相同;重载的方法名称必须相同;重载的方法,其形参个数或类型必须不同,否则将出重载的方法,其形参个数或类型必须不同,否则将出现现“已经定义了一个具有相同类型参数的方法成员已经定义了一个具有相同类型参数的方法成员”的编译错误。的编译错误。例如能同时处理整型与浮点型数据的重载方法:例如能同时处理整型与浮点型数据的重载方法:public void Swap(ref int a,ref int b)public void Swap(ref float a,ref float b)37方法的参数个数不同方法的参数个数不同具
29、有不同数量的参数的方法重载38参数数据类型不同参数数据类型不同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;具有不同类型的参数的方法重载39练习练习在学生类中添加两个方法,一个是只对学生的在学生类中添加两个方法,一个是只对学生的学号赋值,一个是对学号、姓名、性别赋值。学号
30、赋值,一个是对学号、姓名、性别赋值。并在窗体中进行以下改进:并在窗体中进行以下改进:若只输入了学号,就调用只对学生的学号赋值若只输入了学号,就调用只对学生的学号赋值的方法。的方法。若都输入了,就调用对学号、姓名、性别赋值若都输入了,就调用对学号、姓名、性别赋值的方法。的方法。40学生类中的两种重载方法学生类中的两种重载方法/只对学生的学号赋值方法只对学生的学号赋值方法public void Create(string id)this.id=id;/对学号、姓名、性别赋值的方法。对学号、姓名、性别赋值的方法。public void Create(string id,string name,str
31、ing sex)this.id=id;this.name=name;this.sex=sex;41 4.4 构造函数构造函数是一种特殊的方法成员,构造函数的构造函数是一种特殊的方法成员,构造函数的主要作用是在创建对象(声明对象)时初始化主要作用是在创建对象(声明对象)时初始化对象。对象。一个类定义必须且至少有一个构造函数,如果一个类定义必须且至少有一个构造函数,如果定义类时,没有声明构造函数,系统会提供一定义类时,没有声明构造函数,系统会提供一个默认的构造函数,如果声明了构造函数,系个默认的构造函数,如果声明了构造函数,系统将不再提供默认构造函数。统将不再提供默认构造函数。424.4.1 声明
32、构造函数 声明构造函数与声明普通方法相比,有两个特别要求,声明构造函数与声明普通方法相比,有两个特别要求,一是构造函数不允许有返回类型包括一是构造函数不允许有返回类型包括void类型,类型,二是构造函数的名称必须与类名相同。二是构造函数的名称必须与类名相同。所以构造函数往往需要使用形参,例如创建一个学生所以构造函数往往需要使用形参,例如创建一个学生类对象时,需要给出学生的学号、姓名、性别及年龄类对象时,需要给出学生的学号、姓名、性别及年龄等,所以学生类构造函数可以声明如下:等,所以学生类构造函数可以声明如下:public Student(string ID,string nname,strin
33、g)id=ID;name=nname;sex=ssex;43构造函数的自动调用构造函数的自动调用创建对象时,将自动调用构造函数创建对象时,将自动调用构造函数创建对象时须按照声明的构造函数的参数要求创建对象时须按照声明的构造函数的参数要求给出实际参数,否则将产生编译错误,例如:给出实际参数,否则将产生编译错误,例如:Student s1=new Student(“2005001”,“张三张三”,“女女”);由上述创建对象的语句可知,由上述创建对象的语句可知,new关键字后面关键字后面实际是对构造函数的调用。实际是对构造函数的调用。44 4.4.2 重载构造函数重载构造函数 例如为学生类重载一个只
34、初始化姓名的构造函数,代码如例如为学生类重载一个只初始化姓名的构造函数,代码如下:下:public Student(string nname)name=nname;如果在声明了带参数的构造函数后,还想保留默认构造函如果在声明了带参数的构造函数后,还想保留默认构造函数,则必须显式声明一个默认构造函数。数,则必须显式声明一个默认构造函数。以以Student类为例,声明默认构造函数如下:类为例,声明默认构造函数如下:public Student()/显式声明默认构造函显式声明默认构造函数数45补充:析构函数补充:析构函数是用于执行清除操作的特殊方法是用于执行清除操作的特殊方法析构函数的名字与类名相同
35、析构函数的名字与类名相同,但前面要加一个但前面要加一个”析构函数无修饰符,不带参数析构函数无修饰符,不带参数,也没有返回值也没有返回值当撤销对象的时候当撤销对象的时候,自动调用析构函数自动调用析构函数析构函数不能被继承析构函数不能被继承,也不能被重载也不能被重载()0 /析构函数的主体 语法语法:Student()示例:46举例:修改学生信息举例:修改学生信息学生创建后,单击修改按钮,则打开另一个窗学生创建后,单击修改按钮,则打开另一个窗体,修改此学生的信息,修改以后的学生信息体,修改此学生的信息,修改以后的学生信息可以显示创建学生信息的窗体中可以显示创建学生信息的窗体中47操作步骤操作步骤1
36、)创建两个窗体)创建两个窗体FrmStudentAdd.cs和和FrmStudentModi.cs2)编写)编写FrmModiStudent.cs构造函数和构造函数和Load事件代码事件代码48编写保存按钮的代码编写保存按钮的代码49编写编写FrmStudentAdd窗体修改学生按钮的代码窗体修改学生按钮的代码504.5 静态成员类可以具有静态成员,例如静态字段、静态方法、静类可以具有静态成员,例如静态字段、静态方法、静态构造函数、静态属性等。态构造函数、静态属性等。静态成员与非静态静态成员与非静态(实例)成员的不同在于:实例)成员的不同在于:静态成员属于类,为这个类的所有实例所共享静态成员属
37、于类,为这个类的所有实例所共享.非静态成员则总是与特定的实例(对象)相联系。非静态成员则总是与特定的实例(对象)相联系。声明静态成员需要使用声明静态成员需要使用static修饰符。修饰符。514.5.1静态成员和实例成员静态成员和实例成员q用用StaticStatic修饰符声明成员的时候修饰符声明成员的时候,得到的是静态成员得到的是静态成员,静态成员属于整静态成员属于整个类所有个类所有,为这个类的所有实例所共享为这个类的所有实例所共享.包括方法和属性包括方法和属性 例:例:public static public static intint countcount;/;/静态数据成员静态数据成员
38、q不用不用StaticStatic修饰的成员是实例成员修饰的成员是实例成员,实例成员属于类的实例实例成员属于类的实例 例:例:public string name;/public string name;/数据成员数据成员q访问格式:访问格式:类名类名.静态成员静态成员 例:例:Student.countStudent.count实例名实例名.实例成员实例成员 例:例:student std1=new student();student std1=new student();std1.std1.namename524.5.2静态方法静态方法静态方法同样使用修饰符静态方法同样使用修饰符stati
39、c声明,声明,静态方法属于类,只能使用类调用,不能使用对静态方法属于类,只能使用类调用,不能使用对象调用。象调用。静态方法与非静态方法一样可以重载。静态方法与非静态方法一样可以重载。静态方法只能访问类中的静态数据成员,访问非静态方法只能访问类中的静态数据成员,访问非静态数据成员是错误的。静态数据成员是错误的。所有的所有的Main()函数都是静态的。函数都是静态的。53 4.5.3 C#中的常用类型转换静态方法在在C#的的System命名空间中,有一个命名空间中,有一个Convert(转(转换)类,该类提供了由字符串类型转换为相应其他基换)类,该类提供了由字符串类型转换为相应其他基本数据类型的一
40、系列静态方法。本数据类型的一系列静态方法。类型转换方法最常用的调用格式之一是:类型转换方法最常用的调用格式之一是:Convert.静态方法名(字符串类型数据)1.Convert.ToInt32方法2.Convert.ToSingle方法3.Convert.ToChar方法4.Convert.ToBoolean方法544.6this关键字关键字引用类的当前实例。他隐含于每一个类的成员函数引用类的当前实例。他隐含于每一个类的成员函数中中静态成员函数没有静态成员函数没有this指针。指针。常用用法:常用用法:限定被相似的名称隐藏的成员限定被相似的名称隐藏的成员将对象作为参数传递到其他方法将对象作为参
41、数传递到其他方法声明索引器声明索引器55thisthis限定被相似的名称隐藏的成员限定被相似的名称隐藏的成员 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;56this将对象作为参数传递到其它方法。将对象作为参数传递到其它方法。class student /学生类学生类 public DateTime birthday;/出生日期出生日期 publi
42、c 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);574.7索引器索引器索引器类似于类的属性,它使得对象可
43、以像数组那样被方便、直观的引用。索引器类似于类的属性,它使得对象可以像数组那样被方便、直观的引用。但索引器可以有参数列表,且只能作用在实例对象上,而不能在类上直接作但索引器可以有参数列表,且只能作用在实例对象上,而不能在类上直接作用。用。1.1.索引器声明格式:索引器声明格式:类型类型1 this 1 this 类型类型2 2 索引索引 get;set;说明:说明:类型类型1 1 表示索引器属性返回值类型。表示索引器属性返回值类型。类型类型2 2 表示索引参数的类型,可为整型、字符串或其他类型。表示索引参数的类型,可为整型、字符串或其他类型。ThisThis关键字是索引器所属对象的引用。关键字
44、是索引器所属对象的引用。getget和和setset与属性声明相同。与属性声明相同。2.2.索引器访问格式:索引器访问格式:对象对象 索引索引 58举例:编写一个能实现能对一组学生进行操作的索引。举例:编写一个能实现能对一组学生进行操作的索引。public class Studentarray Student stdarr;/该数组用于存放一组学生信息该数组用于存放一组学生信息 public Studentarray(int count)/初始学生数组中的元素个数初始学生数组中的元素个数 stdarr=new Studentcount;public Student thisint index
45、/创建带有创建带有int参数的参数的Student索引器索引器 get /验证索引范围验证索引范围 if(indexstdarr.Length)return null;return stdarrindex;/对于有效索引,返回指定元素的学生对于有效索引,返回指定元素的学生 set if(index stdarr.Length)return;stdarrindex=value;/给指定数组元素赋值给指定数组元素赋值 59public Student thisstring name get foreach(Student i in stdarr)if(i._name=name)return i;r
46、eturn null;带有带有 string 参数的参数的 Student 索引器索引器60调用索引器举例调用索引器举例61添加按钮代码添加按钮代码62修改按钮代码修改按钮代码63定义和调用索引器定义和调用索引器 4-1 演示class Photostring _title;public Photo(string title)this._title=title;public string Titlegetreturn _title;以 Title 属性表示照片将照片存放于数组 photos 中class Album/该数组用于存放照片Photo photos;public Album(int
47、capacity)photos=new Photocapacity;64定义和调用索引器定义和调用索引器 4-2public Photo thisint indexget/验证索引范围if(index=photos.Length)Console.WriteLine(索引无效);/使用 null 指示失败return null;/对于有效索引,返回请求的照片return photosindex;setif(index=photos.Length)Console.WriteLine(索引无效);return;photosindex=value;带有 int 参数的 Photo 索引器读/写索引器6
48、5定义和调用索引器 4-3public Photo thisstring titleget/遍历数组中的所有照片foreach(Photo p in photos)/将照片中的标题与索引器参数进行比较 if(p.Title=title)return p;Console.WriteLine(未找到);/使用 null 指示失败return null;带有 string 参数的 Photo 索引器只读索引器66定义和调用索引器定义和调用索引器 4-4static void Main(string args)/创建一个容量为 3 的相册Album family=new Album(3);/创建 3
49、张照片Photo first=new Photo(Jeny);Photo second=new Photo(Smith);Photo third=new Photo(“Lono);/向相册加载照片 family0=first;family1=second;family2=third;/按索引检索Photo objPhoto1=family2;Console.WriteLine(objPhoto1.Title);/按名称检索Photo objPhoto2=family“Jeny;Console.WriteLine(objPhoto2.Title);67委托和事件案例准备委托和事件案例准备684.
50、8委托委托委托属于引用类型,用于委托属于引用类型,用于封装方法的引用封装方法的引用,类似于,类似于C+的函数指针,以函数作为参数。的函数指针,以函数作为参数。委托是完全面向对象的,是类型安全和可靠的。委托是完全面向对象的,是类型安全和可靠的。委托是事件的基础委托是事件的基础 委托是委托是“函数指针函数指针”在在C#中的更好实现,事件是中的更好实现,事件是“回回调函数调函数”在在C#中的更好实现。中的更好实现。使用委托的几个步骤:使用委托的几个步骤:委托声明,委托实例化和委托调委托声明,委托实例化和委托调用用694.8.1委托声明委托声明 格式:格式:修饰符修饰符 delegate 返回值类型返