C#课程教学5

上传人:豆****2 文档编号:120160048 上传时间:2022-07-16 格式:PPT 页数:43 大小:812KB
收藏 版权申诉 举报 下载
C#课程教学5_第1页
第1页 / 共43页
C#课程教学5_第2页
第2页 / 共43页
C#课程教学5_第3页
第3页 / 共43页
资源描述:

《C#课程教学5》由会员分享,可在线阅读,更多相关《C#课程教学5(43页珍藏版)》请在装配图网上搜索。

1、主要内容l函数的定义、使用l属性与域的定义以及使用 C#中函数的定义l在大多数的应用软件的设计中,将应用程序分成若干个功能单元。由于小段的程序更易于理解、设计、开发和调试,因此采用功能单元是应用程序设计的核心法则。分为若干个功能单元以便在应用程序中重用功能构件。另外,在整个大的程序中,某些任务常常要在一个程序中运行好多次,举个最简单的例子,对多个数组进行排序。此时我们就可以把这些相同的代码段写成一个单独的单元,需要的时候我们就来调用它。C#.NET程序语言中我们把这个单独的单元叫做函数 函数的特点 l函数拥有自己的名称,可以使用合法的C#.NET标识符来命名。但其名称不能与变量、常数或定义在类

2、内的属性或者其他方法名重复。l函数内声明的变量属于局部变量,也就是说C#.NET在不同函数内声明的变量彼此互不相关,其作用域局限在该函数内。所以在不同的函数内允许声明相同局部变量名称。l函数有特定功能,程序代码简单明确,可读性高而且容易调试和维护。5.1 函数的定义和使用 l函数就是代码的逻辑片断,它可以执行特定的操作。对象或者类调用函数来实现函数的功能。函数可以有返回类型,当然,返回类型也可以是Void。函数声明的语法为:(参数1,参数2,)函数的修饰符 l函数的修饰符有很多,如:lnewlpubliclprotectedlinternallprivatelstaticlvirtuallse

3、aledloverridelabstractlextern 函数修饰符的含义l上面诸多函数修饰符中,Public、Protected、Internal、Protected Internal、Private是对函数作用域的修饰,其余的关键字有其他的含义,在此,我们只讲函数作用域修饰符的意义。函数修饰符的含义一个简单的调用函数的例子l声明函数之后,我们就可以调用任何类或者对象所使用的函数。l例:第一个函数的定义以及调用 lusing System;lusing System.Collections.Generic;lusing System.Text;lnamespace Example1Of5l

4、l class Programl l static void Main(string args)l l Console.WriteLine(输入你的大名:);l string s=Console.ReadLine();l myFirstMethod(s);l l static void myFirstMethod(string s1)l l Console.WriteLine(Welcome+s1+,You have entered the world of the method!);l l l程序运行结果5.2函数参数的传递方式l在调用函数的时候,可以向函数传递参数列表。C#中函数的参数有4

5、种类型:l值参数,不含任何修饰符。l引用型参数,以Ref修饰符声明。l输出参数,以Out修饰符声明。l数组型参数,以Params修饰符声明。l若A语句中调用函数B,两者间有参数传递,那么,我们将A调用语句中传送的参数称为实参;被调用的函数B中使用的参数成为形参。5.2.1 值参数 l当利用值向函数传递参数时,编译程序给实参的值做一份复制,并且将此复制传递给该函数。被调用的函数不会修改内存中实参的值,所以使用值参数时,可以保证实际值是安全的。值参数传递示例l例例 值参数传递示例。l程序代码:using System;namespace Example3Of5 class Program stat

6、ic void Main(string args)int a=3;int b=5;change(a,b);Console.WriteLine(a=0,b=1,a,b);static void change(int a1,int b1)int t;t=a1;a1=b1;b1=t;程序运行结果l此程序的输出结果是a=3,b=5,可见我们并没有达到交换的目的,在这个程序里我们采用了值参数传递,形参值的修改并不影响实参的值。5.2.2 引用型参数 l与值参不同的是,引用型参数并不开辟新的内存区域。当利用引用型参数向函数传递形参时,编译程序将把实际值在内存中的地址传递给函数。l在函数中,引用型参数通常已

7、经初始化。引用型参数传递例子l例例 把上面例子改写成引用型参数传递。程序代码:using System;namespace Example4Of5 class Program static void Main(string args)int a=3;int b=5;change(ref a,ref b);Console.WriteLine(a=0,b=1,a,b);static void change(ref int a1,ref int b1)int t;t=a1;a1=b1;b1=t;运行结果及分析l此程序的输出结果是a=5,b=3。在Main()函数中,调用了change函数,使用引用型

8、参数,成功地实现了a和b的交换。a1和b1所处的内存区域其实就是a和b所处的内存区域,所以当a1和b1的值互换时,a和b的值自然会发生变化。5.2.3 输出型参数 l与引用型参数类似,输出型参数也不开辟新的内存区域。与引用型参数的差别在于,调用前不需对变量进行初始化。输出型参数用于传递方法返回的数据。lOut修饰符后应跟随与形参的类型相同的类型声明。在方法返回后,传递的变量被认为经过了初始化。Out关键字使用小例子l例例 使用Out关键字练习编写输出参数。l程序代码:lusing System;lnamespace Example5Of5ll class Programl l static v

9、oid Main(string args)l l Console.WriteLine(n out 参数输出 *n);l int a,b;l UseOut(out a,out b);l Console.WriteLine(n 调用UseOut函数后返回主程序:a=0,b=1,a,b);l Console.ReadLine();l l private static void UseOut(out int x,out int y)l l int temp;l x=20;l y=30;l Console.WriteLine(n 函数内交换前 x=0,y=1,x,y);l temp=x;l x=y;l

10、y=temp;l Console.WriteLine(n 函数内交换后 x=0,y=1,x,y);l l l 运行结果5.2.4数组型参数 lC#允许为函数指定一个(只能指定一个)特定的参数,这个参数必须是函数定义中的最后一个参数,称为数组型参数。数组型参数可以使用个数不定的参数调用函数,它可以使用params关键字来定义。另外,参数只允许是一维数组。比如int 和 int类型都可以作为数组型参数,而int,则不可以。最后,数组型参数不能再有Ref 和Out 修饰符。数组型参数示例l例例数组型参数示例 lusing System;lnamespace Example6Of5ll class P

11、rograml l static void Main(string args)l l l int maxAge=Max(18,23,19,22,27);l Console.WriteLine(the max of age is:0,maxAge);l l static int Max(params int Age)l l int temp=0;l for(int i=0;i Age.Length;i+)l l if(temp Agei)l temp=Agei;l l return temp;l l l程序运行结果数组型参数示例l例例 数组型参数示例(多种类型的实参,同一形参)。l程序代码:lu

12、sing System;lnamespace Example7Of5ll class Programl l static void Main(string args)l l int f1=1,2,3,4;l Output(f1);l Output(10,20,30);l Output();l Console.ReadLine();l l static void Output(params int a)l l Console.WriteLine(there are 0 elements:,a.Length);l foreach(int i in a)l l Console.Write(0,i);

13、l l Console.WriteLine();l l l程序运行结果 5.2.5参数的匹配 l在调用函数时,实参和形参必须完全匹配,这意味着形参与实参之间类型、个数和顺序都要完全匹配。例如下面的函数:private void f(int a,string b)Console.WriteLine(dsahfsd;hnf);l则不能使用下面的代码调用;f(1,2);l这是因为,函数的形参第一个为整型,第二个为string型。而调用函数的代码中第一个实参为整型,第二个还是整型,与函数的第二个形参不匹配。同样,上面的函数也不能被以下代码调用:f(there);这里的实参形参个数明显不一样,所以不可以

14、。参数的不匹配通不过编译,因为编译器要求必须匹配函数的签名。5.3 区块变量与属性成员 5.3.1 区块变量 lC#.NET 语言中,区块变量被定义于某个区块中,比如说前面所讲的While循环语句中声明的变量,只能在所定义的While循环中使用。也就是说,某区块中定义的变量,只能供这个区块使用,区块以外使用则报错。5.3.2 属性成员l属性成员跟在第二章中介绍的静态变量一样,不同的是对象属性是放在堆里面的,必须对对象进行实例化,才可以使用属性;而静态字段是放在全局变量区的,不需要实例化对象就直接可以引用静态变量。lclass testll public static int value;/静态

15、变量l public int value1;/对象属性l5.4 Main()函数 l所有的C#应用程序必须在它的一个类中定义一个名为Main的函数。这个函数作为应用程序的入口点,它必须被定义为静态的。具体在哪个类中使用Main()函数对C#编译器并无影响,而且你选择的类也不影响编译的次序。这与C+不同,在C+中编译应用程序时必须密切注意依赖性。C#编译器很精明,可以自己在源代码文件中自动搜寻到Main()函数。因此,这个最重要的方法是所有C#应用程序的入口点。l虽然一个C#应用中可能会有很多类,但是其中只有一个入口。在同一个应用中,可能多个类都有Main()函数,但是只有一个Main()函数是

16、被执行的。你需要在编译的时候指定究竟使用哪一个Main()函数。l常见的Main()函数是这样的:static void Main(string args)lMain()函数中的参数Args是从应用程序的外部接受信息的方法,这些信息在运行期间指定,其形式是命令行参数。l细心的读者会注意到,Main()函数必须定义为静态的,这是因为C#.NET是一门真正的面向对象的编程语言,Main()函数是整个应用程序的入口,Static可以保证程序调用的时候不需要实例化就可以运行程序。看看下面的一段代码:lnamespace testll class Testl l public void Instance

17、Method()/实例成员(非静态)l public static void StaticMethod /类型成员(静态)l static void Main(string args)l l InstanceMethod();/错误!调用了实例成员,而此时并没有建立实例 l StaticMethod();/正确!可以调用静态成员 l Test SomeTest=new Test();/建立本类型的一个实例 l SomeTest.InstanceMethod();/再在这个实例上调用实例成员就对了 l SomeTest.StaticMethod();/附加一句,在实例上调用静态成员也是错误的!l

18、 l 上面的代码中注释很明确,在这里就不多解释了。5.5 字段 l字段声明方法:field-modifiers type variable-declarators;其中field-modifiers表示字段的修饰符,type表示字段的具体类型,variable-declarators表示字段的变量名。l字段的修饰符field-modifiers可以是:lnewlpubliclprotectedlinternallprivate lstaticlreadonly5.6 属性 l属性的定义跟域有些相似,但是内容要比域的内容多。属性是对现实世界中实体特征的抽象,它提供了对类或对象性质的访问。比如,一

19、个用户的姓名、一个文件的大小、一件物品的重量都可以作为属性。类的属性所描述的是状态信息,在类的某个实例中属性的值表示该对象的状态值。属性的修饰符l属性的修饰符property-modifiers有:lnewlpubliclprotectedlinternallprivatelstaticlvirtuallsealedloverridelabstract属性定义举例l下面的代码简单地介绍了属性myProperties的定义。lclass All private int i;l public int myPropertiesl l getl l return i;l l setl l i=valu

20、e;l lGet与set语句块的解释lGet语句块是用于读取属性值的方法,其中没有任何参数,但是返回属性声明语句中所定义的数据类型值。在Get语句块中,包含Return或者Throw语句,这个可以有效地防止执行控制权超出Get语句块。简单的属性一般与一个私有域相关联,以控制对这个域的访问,此时Get语句块可以直接返回该域的值。lSet语句块以类似的方式把一个值赋给域,可以使用关键字Value引用用户提供的属性值。比如上面定义的属性,我们要把整数10赋值给myProperties属性,可以使用下面的语句:l在声明属性语句中,可以对属性进行分类:l只读属性:属性定义中只有Get语句,表明属性的值只

21、能进行读出而不能设置。l只写属性:属性定义中只有Set语句,表明属性的值只能进行设置而不能读出。l读写属性:属性定义中既有Get语句又有Set语句,表明属性的值既能进行读出又能进行设置。结论l本章我们主要介绍了函数的定义、使用以及几种参数传递的不同和注意事项。后面我们还介绍了属性与域的概念以及使用方法。l函数是各种程序语言中极其重要的一部分,在Visual C#中也不例外,函数拥有多种特性,如继承、委托等,这些我们将在后面的章节予以介绍。本章还详细讨论了函数中各种参数传递的方式以及函数的返回值。l之后,我们在本章讨论了字段与属性这2个概念,它们都是用来保存类的实例的各种数据信息。其中,属性实现了良好的数据封装和数据隐藏;字段可以分为静态字段和非静态字段。谢谢!

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!