06第2章 c#语言基础.ppt
《06第2章 c#语言基础.ppt》由会员分享,可在线阅读,更多相关《06第2章 c#语言基础.ppt(40页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第3章章 C#语言基础语言基础 3.5 类和结构 3.5.1 定义类和结构定义类和结构3.5.2 定义属性定义属性3.5.3 定义索引器定义索引器3.5.4 方法重载方法重载3.5.5 使用使用ref和和out类型参数类型参数3.5.6 抽象类和接口抽象类和接口 方法参数的功效就是能使信息在方法中传入或传出,当声方法参数的功效就是能使信息在方法中传入或传出,当声明一个方法时,包含的参数说明是形式参数(明一个方法时,包含的参数说明是形式参数(形参形参)。当调用)。当调用一个方法时,给出的对应实际参量是实在参数(一个方法时,给出的对应实际参量是实在参数(实参实参),传入),传入或传出就是在实参与
2、形参之间发生的,在或传出就是在实参与形参之间发生的,在C#中实参与形参有中实参与形参有四种传递方式。四种传递方式。值参数值参数 引用参数引用参数 输出参数输出参数 参数数组参数数组3.5.5 使用使用ref和和out类型参数类型参数 值参数值参数在方法声明时不加修饰的形参就是值参数,它表明实参在方法声明时不加修饰的形参就是值参数,它表明实参与形参之间与形参之间按值传递按值传递。当这个方法被调用时,编译器为值参。当这个方法被调用时,编译器为值参数分配存储单元,然后将对应的实参的值拷贝到形参中。实数分配存储单元,然后将对应的实参的值拷贝到形参中。实参可以是变量、常量、表达式,但要求其值的类型必须与
3、形参可以是变量、常量、表达式,但要求其值的类型必须与形参声明的类型相同或者能够被隐式的转化为这种类型。这种参声明的类型相同或者能够被隐式的转化为这种类型。这种传递方式的好处是在方法中对形参的修改不影响外部的实参,传递方式的好处是在方法中对形参的修改不影响外部的实参,也就是说数据只能传入方法而不能从方法传出,所以值参数也就是说数据只能传入方法而不能从方法传出,所以值参数有时也被称为有时也被称为入参数入参数。3.5.5 使用使用ref和和out类型参数类型参数 值参数值参数【例例】下面的程序演示了当方法下面的程序演示了当方法Sort传递的是值参数。传递的是值参数。using System;clas
4、s Myclass public void Sort(int x,int y,int z)int tmp;/将x,y,z按从小到大排序if(xy)tmp=x;x=y;y=tmp;if(xz)tmp=x;x=z;z=tmp;if(yz)tmp=y;y=z;z=tmp;3.5.5 使用使用ref和和out类型参数类型参数 值参数值参数【例例】下面的程序演示了当方法下面的程序演示了当方法Sort传递的是值参数。传递的是值参数。class Test static void Main()Myclass m=new Myclass();int a,b,c;a=30;b=20;c=10;m.Sort(a,b
5、,c);Console.WriteLine(a=0,b=1,c=2,a,b,c);Console.Read();值传递值传递.cs3.5.5 使用使用ref和和out类型参数类型参数 引用参数引用参数 引用参数与值参数不同,引用参数并不创建新的存储单引用参数与值参数不同,引用参数并不创建新的存储单元,它与方法调用中的实在参数变量同处一个存储单元。因元,它与方法调用中的实在参数变量同处一个存储单元。因此,在方法内对形参的修改就是对外部实参变量的修改。此,在方法内对形参的修改就是对外部实参变量的修改。3.5.5 使用使用ref和和out类型参数类型参数 引用参数引用参数【例例】下面的程序演示了当方
6、法下面的程序演示了当方法Sort传递的是引用参数。传递的是引用参数。using System;class Myclass public void Sort(ref int x,ref int y,ref int z)int tmp;/将x,y,z按从小到大排序if(xy)tmp=x;x=y;y=tmp;if(xz)tmp=x;x=z;z=tmp;if(yz)tmp=y;y=z;z=tmp;3.5.5 使用使用ref和和out类型参数类型参数 引用参数引用参数【例例】下面的程序演示了当方法下面的程序演示了当方法Sort传递的是引用值参数传递的是引用值参数 class Test static vo
7、id Main()Myclass m=new Myclass();int a,b,c;a=30;b=20;c=10;m.Sort(ref a,ref b,ref c);Console.WriteLine(a=0,b=1,c=2,a,b,c);Console.Read();引用传递引用传递.cs3.5.5 使用使用ref和和out类型参数类型参数 引用参数引用参数 使用使用ref参数的注意点:参数的注意点:(1)ref关键字仅对跟在它后面的参数有效,而不能应用关键字仅对跟在它后面的参数有效,而不能应用于整个参数表。例如于整个参数表。例如Sort方法中方法中x、y、z都要加都要加ref修饰修饰。(
8、2)在调用方法时,也用在调用方法时,也用ref修饰修饰实参变量,因为是引用实参变量,因为是引用参数,所以要求实参与形参的数据类型必须完全匹配,而且参数,所以要求实参与形参的数据类型必须完全匹配,而且实参必须是变量,不能是常量或表达式。实参必须是变量,不能是常量或表达式。(3)在方法外,在方法外,ref参数必须在调用之前明确赋值,在方参数必须在调用之前明确赋值,在方法内,法内,ref参数被视为初始值已赋过。参数被视为初始值已赋过。3.5.5 使用使用ref和和out类型参数类型参数 输出参数输出参数 在参数前加在参数前加out修饰符的被称为输出参数,它与修饰符的被称为输出参数,它与ref参数参数
9、很相似,只有一点除外,就是它只能用于从方法中传出值,很相似,只有一点除外,就是它只能用于从方法中传出值,而不能从方法调用处接受实参数据。在方法内而不能从方法调用处接受实参数据。在方法内out参数被认参数被认为是未赋过值的,所以在方法结束之前应该对为是未赋过值的,所以在方法结束之前应该对out参数赋值。参数赋值。【例例】下面的程序演示求一个数组元素中的最大值、最下面的程序演示求一个数组元素中的最大值、最小值以及平均值。希望得到三个返回值,显然用方法的返回小值以及平均值。希望得到三个返回值,显然用方法的返回值不能解决,而且这三个值必须通过计算得到,初始值没有值不能解决,而且这三个值必须通过计算得到
10、,初始值没有意义,所以解决方案可以定义三个意义,所以解决方案可以定义三个out参数。参数。3.5.5 使用使用ref和和out类型参数类型参数 输出参数输出参数using System;class Myclass public void MaxMinArray(int a,out int max,out int min,out double avg)int sum;sum=max=min=a0;for(int i=1;imax)max=ai;if(aimin)min=ai;sum+=ai;avg=sum/a.Length;3.5.5 使用使用ref和和out类型参数类型参数 输出参数输出参数c
11、lass Test static void Main()Myclass m=new Myclass();int score=87,89,56,90,100,75,64,45,80,84;int smax,smin;double savg;m.MaxMinArray(score,out smax,out smin,out savg);Console.Write(Max=0,Min=1,Avg=2 ,smax,smin,savg);Console.Read();输出参数输出参数.cs3.5.5 使用使用ref和和out类型参数类型参数 参数数组参数数组 一般而言,调用方法时其实参必须与该方法声明的
12、形一般而言,调用方法时其实参必须与该方法声明的形参在类型和数量上相匹配,但有时候我们更希望灵活一些,参在类型和数量上相匹配,但有时候我们更希望灵活一些,能够给方法传递任意个数的参数,比如在三个数中找最大、能够给方法传递任意个数的参数,比如在三个数中找最大、最小和在最小和在5个数中找最大、最小甚或任意多个数中找最大、个数中找最大、最小甚或任意多个数中找最大、最小能使用同一个方法。最小能使用同一个方法。C#提供了传递可变长度的参数表提供了传递可变长度的参数表的机制,即使用的机制,即使用params关键字来指定一个参数可变长的参关键字来指定一个参数可变长的参数表。数表。【例例】下面程序演示了下面程序
13、演示了Myclass类中的方法类中的方法MaxMin有一有一个参数数组类型的参数,那么在调用这个方法是所具有的个参数数组类型的参数,那么在调用这个方法是所具有的灵活性。灵活性。3.5.5 使用使用ref和和out类型参数类型参数 参数数组参数数组using System;class Myclass public void MaxMin(out int max,out int min,params int a)if(a.Length=0)/如果可变参数为零个,可以取一个约定值max=min=-1;return;max=min=a0;for(int i=1;imax)max=ai;if(aimin
14、)min=ai;3.5.5 使用使用ref和和out类型参数类型参数 参数数组参数数组class Test static void Main()Myclass m=new Myclass();int score=87,89,56,90,100,75,64,45,80,84;int smax,smin;m.MaxMin(out smax,out smin);/可变参数的个数可以是零个Console.WriteLine(Max=0,Min=1 ,smax,smin);m.MaxMin(out smax,out smin,45,76,89,90);Console.WriteLine(Max=0,Mi
15、n=1 ,smax,smin);m.MaxMin(out smax,out smin,score);/可变参数也可接受数组对象Console.WriteLine(Max=0,Min=1 ,smax,smin);Console.Read();参数数组参数数组.cs3.5.5 使用使用ref和和out类型参数类型参数 从上面例程中可以看出设立可变参数非常方便,也很从上面例程中可以看出设立可变参数非常方便,也很实用。但在使用时要注意以下几点:实用。但在使用时要注意以下几点:(1)(1)一个方法中只能声明一个一个方法中只能声明一个paramsparams参数,如果还要其参数,如果还要其他常规参数,则他
16、常规参数,则paramsparams参数应放在参数表的最后。参数应放在参数表的最后。(2)(2)用用paramsparams修饰符声明的参数是一个一维数组类型,修饰符声明的参数是一个一维数组类型,例如,可以是例如,可以是intint,string,double,string,double,或或intint ,string,string 等,但不能是等,但不能是intint,string,string,等。等。(3)(3)由于由于paramsparams参数其实是一个数组,所以在调用时可参数其实是一个数组,所以在调用时可以为参数数组指定零个或多个参数,其中每个参数的类型都以为参数数组指定零个或多
17、个参数,其中每个参数的类型都应与参数数组的元素类型相同或能隐式地转换。应与参数数组的元素类型相同或能隐式地转换。3.5.5 使用使用ref和和out类型参数类型参数 (4)(4)当调用具有当调用具有paramsparams参数的方法时,可以作为一个参数的方法时,可以作为一个元素列表如:元素列表如:(45,76,89,90)45,76,89,90);或作为一个数组或作为一个数组(如:(如:scorescore)传递给)传递给paramsparams参数。参数。(5)(5)无论采用哪种方式来调用方法,无论采用哪种方式来调用方法,paramsparams参数都是参数都是作为一个数组被处理。所以在方法
18、内可以使用数组的长度作为一个数组被处理。所以在方法内可以使用数组的长度属性来确定在每次调用中所传递参数的个数。属性来确定在每次调用中所传递参数的个数。(6)(6)paramsparams参数在内部会进行数据的复制,不可能将参数在内部会进行数据的复制,不可能将paramsparams修饰符与修饰符与refref和和outout修饰符组合起来用。所以在这个修饰符组合起来用。所以在这个方法中即使对参数数组的元素进行了修改,在这个方法之方法中即使对参数数组的元素进行了修改,在这个方法之外的数值也不会发生变化。外的数值也不会发生变化。3.5.5 使用使用ref和和out类型参数类型参数3.5.6 抽象类
19、和接口抽象类和接口 到现在为止,我们使用的类都可以直接用来声明一个对象到现在为止,我们使用的类都可以直接用来声明一个对象类型,并可以实例化。但类型,并可以实例化。但C#C#中也可以有例外中也可以有例外抽象类抽象类。这种。这种类是为了需要而定义的一种非常基本的类,实际上并不想直接类是为了需要而定义的一种非常基本的类,实际上并不想直接使用它,而是为了派生出新的类。使用它,而是为了派生出新的类。抽象类是基类的一种特殊类型。除了拥有普通的类成员之抽象类是基类的一种特殊类型。除了拥有普通的类成员之外,还有抽象类成员。抽象类成员中的方法和属性,只有声明外,还有抽象类成员。抽象类成员中的方法和属性,只有声明
20、(使用关键字(使用关键字abstract),而没有实现部分。由于对实例而言,),而没有实现部分。由于对实例而言,没有实现的成员是不合法的,所以没有实现的成员是不合法的,所以抽象类永远也不能实例化抽象类永远也不能实例化。这种不能实例化的类也有它的作用空间,它们可以在类层这种不能实例化的类也有它的作用空间,它们可以在类层次结构的上层,对于派生于该类的其他类而言,抽象类就确定次结构的上层,对于派生于该类的其他类而言,抽象类就确定了子类的基本结构和意义,从而使程序框架更容易建立。了子类的基本结构和意义,从而使程序框架更容易建立。包含一个或多个抽象函数的类本身必须声明为包含一个或多个抽象函数的类本身必须
21、声明为abstract,但,但是,抽象类可以包含非抽象的成员。从抽象类派生的类必须对是,抽象类可以包含非抽象的成员。从抽象类派生的类必须对基类中包含的所有抽象方法基类中包含的所有抽象方法提供实现过程提供实现过程,否则,它也为抽象,否则,它也为抽象类。抽象函数为隐式的虚函数,所以为继承的抽象类提供了实类。抽象函数为隐式的虚函数,所以为继承的抽象类提供了实现代码的方式与覆盖一个虚方法相似。另外,属性和索引也可现代码的方式与覆盖一个虚方法相似。另外,属性和索引也可以声明为以声明为abstract。抽象类不能自己实例化,需要使用其子类来实例化。抽象抽象类不能自己实例化,需要使用其子类来实例化。抽象类是
22、针对某些某些应用而产生的,抽象类的对象可以指向子类类是针对某些某些应用而产生的,抽象类的对象可以指向子类的实例,并且抽象方法可以被子类方法重写的实例,并且抽象方法可以被子类方法重写(override)(override)。实例:实例:抽象类抽象类.cscs3.5.6 抽象类和接口抽象类和接口 有时候,我们并不希望自己编写的类被继承,或者已经认有时候,我们并不希望自己编写的类被继承,或者已经认定没有必要继承了。于是,定没有必要继承了。于是,C#C#提出了提出了密封类密封类的概念。类声明为的概念。类声明为密封后,就不能用来派生新的类。密封后,就不能用来派生新的类。密封类具有不能用来继承的限制,但它
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 06第2章 c#语言基础 06 c# 语言 基础
限制150内