Chs02C#语言基础.ppt

上传人:max****ui 文档编号:11544691 上传时间:2020-04-28 格式:PPT 页数:59 大小:465KB
返回 下载 相关 举报
Chs02C#语言基础.ppt_第1页
第1页 / 共59页
Chs02C#语言基础.ppt_第2页
第2页 / 共59页
Chs02C#语言基础.ppt_第3页
第3页 / 共59页
点击查看更多>>
资源描述
2020年4月28日,第2章C#语言基础,2020年4月28日,2.1C#语言及其特点,C#读作“Csharp”,它是Microsoft开发的一种用于网络开发的新语言,结合了C/C+的强大功能、VisualBasic的易用性。,2020年4月28日,2.1C#语言及其特点,C#是一种源自于C和C+的、简单的、完全面向对象的程序设计语言。C#语言虽然是从C和C+演变而来,但在一些诸如命名空间、类、方法和异常处理等特定领域进行了很大的改进与优化。C#它不仅适合于网络开发,也可以开发古典风格的Windows应用程序。跨平台性。为了实现跨平台,C#采用了即时编译器(JustInTime,JIT),但它不是简单地移植和套用原有的JIT技术,而是JIT的发展与提升。C#的面向对象的程度要比C+还要高。C#中的基本类型都是基于对象的,C#为每一个基本类型都内建了相应的类,如Int32是系统提供的一个类,基本类型int就映射为类Int32。而C+中找不到这样的内建关系,C+只是提供了操作这些基本类型的工具类,int在C+中并不是基于对象的。C#较C+在面向对象的开发上更简单,使用户使用起来更方便,而且提供了非常强大的兼容性。,C#语言的主要特征,2020年4月28日,2.1C#语言及其特点,C#源于微软的C+,又借鉴了Java的一些设计方法。下面,比较C#与C+和Java的差异。,2020年4月28日,2.2中间语言代码与.NET的跨平台,所谓“中间代码”是一种结构简单、含义明确的记号系统。中间代码是源程序的一种内部表示,或称中间语言。中间代码的作用是可使编译程序的结构在逻辑上更为简单明确,特别是可使目标代码的优化比较容易实现。,什么是中间语言代码,在以往的程序开发中,对程序源代码进行编译后得到的.exe文件都是为硬件所识别的机器代码,可直接运行。但是这种机器码限制了程序的可移植性,因为对于不同的计算机或者不同操作系统,其指令系统是不同的,这种硬件上的差异导致在不同类型的计算机上使用的计算机语言不同,需要针对不同类型的CPU开发不同版本的编译器。例如,在Windows平台上编译的程序不能在Linux系统上运行,除非用Linux系统上的编译器重新编译。,.NET框架上提供了一个可移植的交叉语言平台,使不同语言开发的程序可以在不同的环境、不同的CPU上运行。.NET框架的这种跨平台程序移植能力是通过中间语言(MicrosoftIntermediateLanguage,MIL)来实现的。用.NET框架支持的语言编写的源程序编译后生成的.exe文件不能被计算机直接识别运行,这样的.exe文件被称为Microsoft中间语言文件。本质上说,MIL是内存中的源程序。,2020年4月28日,2.2中间语言代码与.NET的跨平台,MIL文件是通过.NETFramework的虚拟机被称之为通用语言运行时.NETCLR执行。在执行的时候,MIL文件会自动调用CLR中的JIT再次编译,生成机器码,由计算机的CPU处理执行。其运行过程如下图所示。图C#程序的编译执行过程,C#生成的中间语言文件MIL与其他的.NET语言(VisualBasic、J#、C+等)生成的MIL语言完全相同。由于CLR也是共用的,因此,不同语言开发的程序都可以在.NET框架的平台上运行。在程序执行时,JIT会分析中间代码并动态产出高效率的机器执行码,因此,其运行速度快;另外,Java虚拟机仅局限于Java语言程序,而.NET框架中的JIT是语言交叉的,支持多种语言。,中间语言代码的执行,2020年4月28日,一个简单的C#程序,一般高级语言编程需要经过三个过程,即:(1)源程序编辑(2)目标程序编译生成(3)可执行程序运行C#编程也不例外,也包括源程序的编辑、编译生成中间语言和解释运行中间码几个步骤。,C#的编辑与运行,如果计算机上没有安装.NetFramework,那么这些程序将不能够被执行。在程序执行时,.NetFramework将中间代码翻译成为二进制机器码,从而使它得到正确的运行。最终的二进制代码被存储在一个缓冲区(Buffer)中。所以一旦程序使用了相同的代码,那么将会调用缓冲区中的版本。这样如果一个.Net程序第二次被运行,那么这种翻译不需要进行第二次,速度明显加快。,具体来讲,C#程序的开发方式如下:使用任何文本编辑器(如:记事本、Editplus等)编写程序代码,并以.cs保存源文件,使用命令行编译器(csc.exe)进行编译;运行编译后的可执行程序文件。,2020年4月28日,2.3一个简单的C#程序,下面以一个最简单的C#程序为例来分别介绍这三个过程。程序2.1是一个最简单的C#程序的例子其功能是在屏幕上输出:“Hello,欢迎来到C#Word!”。Hello.csusingSystem;namespacemynamespaceclassmyclassstaticvoidMain()Console.WriteLine(“Hello,欢迎来到C#Word!);Console.ReadLine();,首先引用了系统命名空间System,因为所有的程序都要用到该命名空间下的类。接着创建了一个命名空间mynamespace,在该命名空间声明并定义了一个类mycalss,该类包含了一个静态的成员方法Main(),作为执行程序的入口。该方法调用控制台(Console)的WriteLine方法输出“Hello,欢迎来到C#Word!”。,2020年4月28日,2.3一个简单的C#程序(续),建立了该C#程序文件后,下一步就是用.NET框架中包含的编译器csc.exe来编译该程序文件。编译方式如下:cscHello.cs需要注意的是:编译器文件csc.exe是在DOS下运行的,编译时必须进入DOS环境,并且设置该执行文件所在的路径path=C:WINDOWSMicrosoft.NETFrameworkv1.1.4322,或v2.0.50727其中v1.1.4322和v2.0.50727是版本号,其中v1.1.4322是版本号。,C#的编辑与运行,2020年4月28日,2.3一个简单的C#程序(续),编译完成后,就可以运行该程序了。由于是控制台方式,必须在DOS环境下运行,在DOS方式下键入Hello,2020年4月28日,2.3一个简单的C#程序(续),如果安装了VisualStudio.NET,那么可以在VisualStudio.NET2003或VisualStudio.NET2005命令提示下来执行csc.exe编译器,此时,不需要再指定csc.exe的路径。VisualStudioTools-VisualStudio2005命令提示C#编译器不仅可以生成.exe文件,也可以通过选项/t:library生成.dll文件,其中的t的含义是target。程序2.1中如果要生成.dll文件,编译方式如下:csc/t:libraryHello.cs,2020年4月28日,2.3一个简单的C#程序(续),如果觉得DOS环境下的编译太繁琐,那么EditPlus是一个很不错的选择EditPlus是一个功能强大的文本编辑器,EditPlus对于HTML、CSS、PHP、ASP、Perl、C/C+、C#及VBScript的语法突显使得它特别适合编辑文本格式的各种程序代码文件,尤其是它的HTML页面预览功能使得它适合编辑HTML文件,并且还具有FTP命令可以实现本地文件上传到FTP服务器的功能,同时它提供了支持多种语言的集成编译、运行环境。,EditPlus编辑、编译与运行环境,2020年4月28日,EditPlus编译环境的设置,下面以C#语言为例详细说明编译环境的设置在“工具参数选择用户工具”选项页进行设置设置步骤如下:设置组名称,这里也可以不设置,取缺省的设置Group1单击“添加工具应用程序”按钮,进入设置界面在菜单文本编辑框输入菜单项的名次在命令编辑框输入编译器(csc.exe)所在的路径和文件名称各种参数可以在文本框右侧的下拉菜单中获取。以C#为例,其编译环境设置参数如下:菜单文本:编译C#命令:C:WINDOWSMicrosoft.NETFrameworkv1.0.3705csc.exe参数:$(FileName)初始目录:$(FileDir)捕获输出:开启,2020年4月28日,EditPlus编译环境的设置(续),打开EditPlus文本编辑器环境后,选择“工具”“参数选择”选项,打开“参数选择”对话框,选择“用户工具”选项进行设置,设置的界面如下图所示。,2020年4月28日,EditPlus编译环境的设置(序),设置完毕后,你就可以在“工具”菜单运行对应的工具了。编译结果会显示在底部的输出窗口,可以通过“用户工具栏”的快捷按钮编译当前编辑的文件。,2020年4月28日,在EditPlus下运行C#程序,编译完成后,可以在EditPlus环境下直接运行,要在EditPlus环境下运行已编译后的.exe文件,你可以进行如下设置(此时可执行文件需要和编译文件同名):菜单文本:C#运行命令:$(FileNameNoExt)参数:无初始目录:$(FileDir)以C#为例,其编译环境设置参数如下:菜单文本:C#编译(.exe)命令:C:WINDOWSMicrosoft.NETFrameworkv1.0.3705csc.exe。参数:$(FileName)。初始目录:$(FileDir)。捕获输出:(True)。,2020年4月28日,2.4C#的命名空间,命名空间是一种松散的类的集合。C#中的命名空间把各种类组织在一起,使得程序功能清楚、结构分明。使用命名空间有利于实现不同程序间类的重用,也有利于类的组织、管理与使用。一般不要求处于同一个命名空间中的类有明确的相互关系,如包含、继承等。但是由于同一命名空间中的类在默认情况下可以互相访问,所以为了方便编程和管理,通常把需要在一起工作的类放在一个命名空间中。命名空间可以看做一个由类的集合构成的组件(Component)。类库中的类和接口都必须在相应的命名空间中定义,因此程序中多个命名空间都可以含有相同的成员,却不会发生冲突。,什么是命名空间,2020年4月28日,2.4C#的命名空间,将类组织在不同的命名空间的目的是为了更好地利用命名空间中的类。可以使用如下两种方式来引用命名空间中的类。1.使用命名空间名作为类名前缀可以通过类的完整命名空间(可以看做树的节点的路径)来唯一地定位命名空间中的任何类。比如,要引用表示文件系统的类,可以使用以下代码:System.IO.FileSystem.IO是命名空间,而File是特定的类。不同的命名空间中,可以定义同名的类。例如:namespaceFirst/classA的定义namespaceSecond/classA的定义两个命名空间中都定义了类A,但是可以独立使用First.A和Second.A,相互不会干扰。,命名空间的引用,2020年4月28日,2.4C#的命名空间,2加载需要使用的命名空间使用上面的方法,引用一个类时必须附加一个包含命名空间名的前缀,编程中使用起来非常麻烦。另一个解决的方法是在程序文件的开始部分利用using语句将需要使用的整个命名空间加载到当前程序中,这样在程序中需要引用这个类的地方就不需要再使用命名空间名作为前缀。例如:usingSystem;加载一个命名空间后,凡是这个命名空间中的类,都不需要再使用命名空间名作为前缀。例如:usingSystem;namespacemynamespaceclassmyclassstaticvoidMain()Console.WriteLine(Hello,WellcometoC#World!);Console.ReadLine();,2020年4月28日,2.5C#程序的构成,不同的程序文件虽然功能和内容不同,但都有基本统一的框架结构。下面仍以例子程序2.1为例来说明C#程序的构成。usingSystem;/加载.NET框架类提供的系统命名空间Systemnamespacemynamespace/声明一个命名空间mynamespaceclassmyclass/声明一个类定义staticvoidMain()Console.WriteLine(Hello,WelcometoC#World!);,2020年4月28日,2.5C#程序的构成,C#程序的典型结构特征C#用using导入命名空间。所有用到的类都要导入对应的命名空间。用namespace关键字声明一个命名空间,每个C#源代码文件可以包含一个或多个命名空间。类、结构、接口等的定义必须包含在命名空间中。C#源程序是由类定义组成的,是类的集合。就好像任何一个C程序都是由若干个函数组成的一样。每个程序中可以定义若干个类,但是只有一个类是主类(包含Main方法的类),它是C#程序执行的入口点。但作为动态链接库(.dll)的C#程序的源代码文件不必要求有Main方法,可以由若干相互关联或独立的类构成。使用关键字class来定义类,每个类的定义由类头和类体部分组成。类头部分除了声明类名之外,还可以说明类的继承特性。类体部分包括属性和方法这两种类的成员。在C#中不存在全局方法和变量,所有的变量和方法都包含在类的定义中。类体中通常有两种成员:一种是域,包括变量、常量、对象数组;另一种是方法是类似于C中的函数的代码单元块。,2020年4月28日,2.5C#程序的构成,C#程序一般都有如下的典型的框架结构:usingSystem;namespacemynamespace1/命名空间mynamespace1classmyclass1/类定义structmystruct/结构定义interfacemyinterface/接口定义delegatevoidMyDelegate(stringname);/委托定义enummyenum/枚举定义namespacemynamespace2/命名空间mynamespace2classmyclass2/类定义staticvoidMain(stringargs)/类的Main方法Console.WriteLine(Hello,WelcometoC#World!);,2020年4月28日,2.6C#的类和对象定义,下面这个例子示范如何创建和使用用户定义的类以及如何创建动态链接库。利用文本编辑器创建两个文件。内容如下。第一个是Apple.cspublicclassAppleprivatestringvariety=;publicApple(stringappleVariety)this.variety=appleVariety;publicvoidoutputVariety()System.Console.WriteLine(variety);,首先,定义了一个新的用户定义类Apple我们为Apple类的声明加上了public修饰符(publicclassApple),这样其他类就可以创建Apple类的实例。接着定义了实例变量variety。修饰符private表示只有在Apple类的内部才可以直接访问variety变量。这是一种常见的面向对象编程习惯,称为封装。第3行定义了Apple类的构造方法,描述如何创建类实例的蓝图。构造方法总是和类具有相同的名字。Apple类的另一个方法是outputVariety(),2020年4月28日,2.6C#的类和对象定义,第二个文件是Example.cs,内容如下。Example.csclassExamplestaticvoidMain()Applemac=newApple(Macintosh);Applegra=newApple(GrannySmith);Applecor=newApple(Cortland);mac.outputVariety();gra.outputVariety();cor.outputVariety();,Example类是创建并使用用户定义类Apple的实例。用new操作符创建了3个Apple类的实例。创建类的实例时,new操作符将自动调用类的构造方法。创建了3个Apple类的对象之后,依次调用这3个对象的outputVariety方法,由outputVariety方法输出这3个对象里variety的值。,2020年4月28日,2.6C#的类和对象定义,下面来编译和运行这个例子首先要把Apple类编译成动态链接库:csc/t:libraryApple.cs/t:library表示不要创建执行文件,上面的命令将生成一个Apple.dll文件。接下来编译Example.cs,编译命令如下所示:csc/reference:Apple.dllExample.cs其中,参数/reference:Apple.dll表示Example.cs要用到Apple.dll中的类、属性或方法,如果Apple.dll文件是保存在当前应用的/bin子目录下,编译时可以省略/reference:Apple.dll参数,编译器会自动寻找所用到的.dll文件。编译后得到了执行文件Example.exe,执行这个文件可以在控制台上看到如下输出:MacintoshGrannySmithCortland,2020年4月28日,2.7C#的格式与数据类型,标识符是用于标记变量、常量、方法、对象、类等元素的字符串,这个字符串是这些元素的定义、赋值和引用时使用的唯一标识。标识符由编程者自由指定,但必须遵循一定的语法规定。C#对于标识符的定义有如下的规定:标识符的首字符必须为字母、下划线或,接下来的字符可以是字母、数字或下划线。标识符中不应使用C的保留字(见表2.2),如果一定要用保留字,最好使用作为前缀。C#是大小写敏感的语言。class和Class。System和system分别代表不同的标识符,在定义和使用时要特别注意这一点。允许在标识符中使用Unicode转义符(见表2.3)。,C#的标识符,标识符实例:下面的标识符是正确的:myClass_varBIGNUMBER下面的标识符不正确:6TerOfButtonclassshoe-size为了便于理解和阅读,应该使标识符能在一定程度上反映它所表示的变量、常量、对象或类的语义。,2020年4月28日,2.7C#的格式与数据类型,在书写C#源代码时,应遵循以下的基本规则:每行以分号“;”结尾。空行和缩进被忽略。多条语句可以处于同一行,之间以分号“;”分隔即可。注释语句有两种形式:/这是我的注释/*这是我的注释华中科技大学*/,C#书写规则,注意事项习惯VB的人很容易漏了语句末尾的分号,或者随便使用变量但是不声明,这在C#默认情况下是不允许的;VisualBasic中数组元素用()引用,但C#中数组元素要用方括号引用。,2020年4月28日,2.7C#的格式与数据类型,最常见的两大类数据类型是值类型和引用类型。值类型也可以称为基本数据类型,包含简单类型(如整型int、浮点型float等)、枚举类型、结构类型3种。基本数据类型是C#语言中提供的、无法再分解的一种预定义类型引用类型包含的数据类型有字符串类型、数组类型、类类型、对象类型、接口类型和代理类型。表2.4列出了C#中定义的所有数据类型,可以看出C#的数据类型的设置与C语言相近,但C#对其数据类型的取值范围作了扩充。其中string和object类型是引用类型,其他的都是基本数据类型。,C#的数据类型,需要说明的是:C#的字符数据类型char与其他语言相比有较大的改进。C语言等的字符类型是采用ASCII编码。C#的字符类型采用了一种新的国际标准编码方案,即Unicode编码。共可表示65535个不同的Unicode字符,无论东方字符还是西方字符都可以统一用一个字符表达。引用类型string表示Unicode字符序列。,2020年4月28日,2.7C#的格式与数据类型,C#语言是强制类型语言,编译器会自动检测程序代码中的数据类型是否相容,如果不相容则自动进行数据类型转换。编译器能够自动进行的数据类型转换称为隐式转换。隐式转换不会发生数据的损失,也无须程序设计人员介入,由系统自动完成。例如,将byte类型的值赋给int变量时,系统会自动将其转换为int类型。bytebb=50;intii=bb;通常,从小值域范围的类型(如short)到大值域范围的类型(如int、long)系统会自动进行隐式转换。,C#的数据类型转换,2020年4月28日,2.7C#的格式与数据类型,如果编译器不能完成隐式转换,就需要用户进行数据类型的显式转换。C#语言的数据类型显式转换有以下3种方式。1使用强制类型转换运算符“()”转换格式为:(类型)数据;例如,ii是int类型,要将其转换为short类型,可使用下面的强制类型转换语句:intii=50;shortss=(short)ii;,C#的数据类型转换,2020年4月28日,2.7C#的格式与数据类型,2使用System.Convert类的静态成员方法Convert类位于命名空间System中,其静态方法如表2.5所示。例如:intii=100;stringstr=System.Convert.ToString(ii);3使用.NET框架提供的Parse()方法在.NET中,每种基本数据类型都定义了相应的结构,结构都封装了与名称对应的数据类型,并且带有一个静态的Parse()方法,用于相应的类型转换。例如:floatf=200;strings=f.ToString();,C#的数据类型转换,2020年4月28日,2.7C#的格式与数据类型,2使用System.Convert类的静态成员方法Convert类位于命名空间System中,其静态方法如表2.5所示。例如:intii=100;stringstr=System.Convert.ToString(ii);3使用.NET框架提供的Parse()方法在.NET中,每种基本数据类型都定义了相应的结构,结构都封装了与名称对应的数据类型,并且带有一个静态的Parse()方法,用于相应的类型转换。例如:floatf=200;strings=f.ToString();,C#的数据类型转换,2020年4月28日,2.7C#的格式与数据类型,常量是在程序运行过程中保持不变的量。常量有直接常量和符号常量。直接常量是在程序中直接书写的数值或字符串等,如123、66.88,“ThisisamessageforC#”。符号常量是用const修饰的、具有特定值的标识符,其声明方式为:const类型常量名=初始值;例如:constdoublepi=3.1415926;conststringunivName=“HUST”;符号常量必须在声明的时候赋初值,而且一旦初始化后,就不能再赋值。C#中常用的常量有布尔常量、整型常量、字符常量、字符串常量和浮点常量。,C#常量,2020年4月28日,2.7C#的格式与数据类型,1布尔常量布尔常量包括true和false,分别代表真和假。而在C#中,bool类型不能与其他数据类型转换。2整型常量整型常量可以用来给整型变量赋值。如-386L、017777l。3浮点常量浮点常量表示可以含有小数部分的数值变量。可以分为一般浮点常量float类型和双精度浮点常量double类型两种。浮点常量用F、f表示,如32.4F、543.62f;双精度浮点常量用D或d表示,如700041.273d或700041.273,系统默认其为双精度浮点常量。浮点常量还有指数表示法,如3.0513E3是指数形式表示的常量。4字符常量字符常量用一对单引号括起的单个字符表示。如a、Z、8、#,也可以是要表示的字符所对应的Unicode码。5字符串常量字符串常量是用双引号括起的一串若干个Unicode字符。双引号必须在源代码的同一行上。可以使用连接操作符(+)把两个或更多的字符串常量串接在一起组成一个更长的字符串。例如:Howdoyoudo?+n,2020年4月28日,2.7C#的格式与数据类型,变量是在程序的运行过程中数值可能发生变化的数据,通常用来记录运算中间结果或保存数据。C#中的变量必须先声明后使用,声明变量包括指明变量的数据类型和变量的名称,必要时还可以指定变量的初始数值。变量的声明格式如下。访问修饰符数据类型变量名=初始值;变量声明是一个完整的语句,所以它与其他C#语句一样需要用分号结束。例如:intsize=5;/声明整数型变量size,并对其初始化floatf;/声明浮点型变量ff=4.67f;/给变量赋值,C#的变量,2020年4月28日,2.7C#的格式与数据类型,变量的命名应遵循标识符命名规则,变量声明时可以直接给变量赋初值。在C#中要求对变量明确赋初值,使用未初始化的变量会导致编译错误。如果变量声明时没有给变量赋初值,变量会带有表2.7所示的默认的初始值。变量的定义举例如下:intii=1;stringcname=“RMITUniversity”;Booleanmarried=true;,C#的变量,C#的变量有一定的生存期和有效范围。C#变量的有效范围就是声明它的语句所在的语句块,一旦程序的执行离开了这个语句块,变量就变得没有意义了。例如:intsum=0;for(inti=0;i10;i+)sum+=i;/在这对之外,sum不存在了C#程序代码可以看做类的集合,不能在类之外声明任何的变量和方法因此在C#中不存在类似其他语言中的全局变量。,2020年4月28日,2.7C#的格式与数据类型枚举与数组,枚举类型的取值范围是有限的,可以一一列举,例如星期、月份、员工的性别等,实际上枚举可看成是一组相关的符号常量的集合。C#语言中,枚举类型使用关键字enum声明,其语法格式如下:访问修饰符enum类型名:基类型枚举值列表其中,基类型表示枚举值的基本类型,默认类型是int。枚举值列表之间用逗号“,”分割,对于枚举值的访问必须用枚举类型名进行限定。例如,下面定义了一个Week的枚举:enumWeekSunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday值得注意的是枚举类型值与整型之间要进行显式的转换。例如:intw=(int)Weeks.Saturday;,默认情况下,枚举的第一个常数的值初始化为0,后面的值初始化为前面的值加1。例如,上面的Week枚举中Sunday值为0,Monday值为1,Tuesday值为2,Wednesday值为3,Thursday值为4,Friday值为5,Saturday值为6。也可以使用赋值语句改变枚举中常数的初始值。例如,上面的Week枚举可以表示为:enumWeekSunday,Monday=10,Tuesday,Wednesday,Thursday,Friday,Saturday上面的Weeks枚举中Sunday值为0,Monday值为10,Tuesday值为11(前面的Monday值加1),Wednesday值为12依此类推,Saturday的值为15。,C#的枚举,2020年4月28日,2.7C#的格式与数据类型枚举与数组,数组是一种常用的数据结构,相同数据类型的元素按一定顺序线性排列就构成了数组,它包含若干个数组元素。数组元素可以通过索引进行访问,C#数组从0开始建立索引,即数组元素索引从0开始,最后一个数组元素的索引为数组长度减1。在C#中数组的元素可以是简单数据类型,也可以是其他任何类型,包括数组类型。创建一个C#数组需要下面3个步骤。步骤1:声明数组声明数组的语法格式有两种:两种定义方法没有什么差别。数组元素类型数组名;数组元素类型数组名;方括号是数组的标志,例如:intMyIntArray;stringMyStrArray;,C#的数组,2020年4月28日,2.7C#的格式与数据类型枚举与数组,步骤2:创建数组空间声明数组仅仅指定了数组的名字和数组元素的类型,还需要为它开辟内存空间。C#不支持变长的数组,所以在创建数组空间时必须指明数组的长度,以确定所开辟的内存空间的大小。创建数组空间的语法格式如下:数组名=new数组元素类型数组元素的个数;上面的两个数组可以这样创建空间:MyIntArray=newint10;MyStrArray=newstring15;创建数组空间的工作也可以与声明数组合在一起,用一条语句完成。例如:intMyIntArray=newint10;stringMyStrArray=newstring15;如果直接在数组声明时指定数组的长度,则编译时会出现错误。如:int100MyIntArray;/是错误的,2020年4月28日,2.7C#的格式与数据类型枚举与数组,步骤3:创建数组元素并初始化可以在数组声明时直接对数组进行初始化。例如:intMyIntArray=newint0,1,2,3,4,5,6;stringMyStrArray=newstring“Red”,“Green”,“Blue”;也可以使用下面的简写方式:intMyIntArray=0,1,2,3,4,5,6;stringMyStrArray=“Red”,“Green”,“Blue”;,C#数组时需要注意的几个问题。数组元素的索引从0开始。例如长度为10的数组,其元素下标为09。所有的数组都有一个属性length,这个属性存储了数组元素的个数。C#系统能自动检查数组索引是否越界的情况。避免这种情况出现的一个有效方法是利用上面提到的length属性作为数组索引的上界。,2020年4月28日,2.7C#的格式与数据类型枚举与数组,数组使用的例子如例子程序。程序2.2:MyArray.csusingSystem;namespacemynamespaceclassClass2publicstaticstringColors=Red,Green,Blue,White,Yello;staticvoidMain()for(intii=0;iiColors.Length;ii+)Console.WriteLine(Colorsii);,2020年4月28日,2.8运算符与表达式,C#的运算符与C+语言基本类似。表2.8列出了C#的所有运算符。,C#运算符,2020年4月28日,2.8运算符与表达式,表达式是由变量、常量、对象、方法和运算符等按一定规则组成的式子。表达式的含义与数学上的表达式基本相同。表达式的值就是对它运算后所得的结果。符合语法规则的表达式可以被编译系统理解、执行或计算。例如:55+25/其值等于8015+System.Math.Sqrt(16)/值等于19System.Math.sqrt(x+y+z)*(x+y)2)如果表达式包含多个运算符号,那么它们的计算顺序由运算符的优先级(见表2.10)决定,要改变表达式中的运算顺序可在表达式中使用圆括号。,C#表达式,2020年4月28日,2.9方法定义与使用,在C#语言中,不存在全局方法,所有的方法都只能存在于类(或结构)中,并以类的成员方法(Method)的形式出现。C#程序可以看成类的集合,只能通过类才能对变量和方法进行访问。例如,计算表达式1+2+3+n的总和,在C和C+中,可以定义一个全局方法,如下:longSum(intn)ints=0;/定义一个累加器,初值为0for(intii=1;ii=n;ii+)s+=ii;returns;然后在代码中调用该方法即可:longs=Sum(n);,2020年4月28日,2.9方法定义与使用,在C#中不存在独立的方法,所有的方法都必须在类中声明和实现。因此,在C#中,上述方法可以改为以下形式:publicclasssumClass/声明一个类,并定义类的实体publicstaticsums;/声明一个公共静态属性publicstaticlongSum(intn)/类的静态成员方法ints=0;/定义一个累加器,初值为0for(intii=1;iic)max=a;elsemax=c;elseif(bc)max=b;elsemax=c;Console.WriteLine(3个数中最大值是:+max.ToString();returnmax;,2020年4月28日,2.11流程控制语句,switch语句switch语句是多分支的开关语句,它的一般格式如下:switch(条件或变量表达式)caseoption1:break;caseoption2:break;default:break;,需要注意的是,switch语句的每一个case判断,都只负责指明流程分支的入口点,而不负责指定分支的出口点,分支的出口点需要编程人员用相应的跳转语句来标明。所以每个分支的语句块最后一个语句应该是流程跳转语句“break;”,它的作用是跳转出整个switch语句。,2020年4月28日,2.11流程控制语句,intn;stringsweek;switch(n)case1:sweek=“星期一”;case2:sweek=“星期二”;case3:sweek=“星期三”;case0:sweek=“星期日”;,假设变量n的值为1,执行完switch语句后,变量sweek的值被赋成什么呢?是“星期日”,而不是“星期一”。因为case判断只负责指明分支的入口点,表达式的值与第一个case分支的判断值相匹配后,程序的流程进入第一个分支,将sweek的值置为“星期一”。由于没有专门的分支出口,所以流程将继续沿着下面的分支逐个执行,sweek的值依次被置为“星期一”、“星期二”,最后变成“星期日”。如果希望程序的逻辑结构正常完成分支的选择,则需要为每一个分支另外编写退出语句break;。,2020年4月28日,2.11流程控制语句,为什么C#的switch的每个分支需要增加一个break呢?这是因为在某些情况下,switch语句的这个只有分支入口、没有出口的功能也有它独特的适用场合。如在若干判断值共享同一个分支时,就可以实现由不同的判断语句流入相同的分支。下面的例子是根据学生的成绩判断是否及格与不及格:switch(stGrade)caseA:caseB:caseC:stScore=“及格”;break;default:stScore=“不及格”;,2020年4月28日,2.11流程控制语句,循环结构是在一定条件下,反复执行某段程序的流程结构,被反复执行的程序被称为循环体。循环结构是程序中非常重要和基本的结构,它是由循环语句来实现的。C#的循环语句共有3种:while语句、dowhile语句和for语句。while语句while语句的一般语法格式如下:while(条件表达式)/循环体,循环语句,条件表达式的返回值为布尔型由括起来的循环体是由多条语句组成的语句块,也可以是单个语句(此时,可以省略)。while语句的执行过程是先判断条件表达式的值,若为真,则执行循环体,循环体执行完之后再检查循环条件,直到条件表达式为假时,跳过循环,执行循环体语句后面的语句。,2020年4月28日,2.11流程控制语句,dowhile语句dowhile语句的一般语法结构如下:do/循环体while(条件表达式);,dowhile语句的使用与while语句很类似不同的是它不像while语句是先计算条件表达式的值,而是无条件地先执行一遍循环体,再来检查条件表达式。若表达式的值为真,则再次执行循环体,否则跳出dowhile循环。可以看出,dowhile语句的特点是它的循环体将至少被执行一次。,for语句for语句的一般语法格式如下:for(表达式1;表达式2;表达式3)/循环体for语句是C#语言3个循环语句中功能最强、使用较广泛的一个。,3个表达式之间用分号(;)隔开。for语句的执行过程是:首先计算表达式1,完成必要的初始化工作,再判断表达式2的值,若为真,则执行循环体,执行完循环体后再执行表达式3,计算并修改循环条件。第二次循环时,首先检查表达式2的值,若为真,则继续循环,否则跳出整个for语句执行下面的句子。,2020年4月28日,2.11流程控制语句,例如:计算1100的和,3个循环的表达方式分别如下:,/while循环inti;intsum=0;while(i100);,/for循环inti;intsum=0;for(i=1;i=100;i+)sum=sum+i;,2020年4月28日,2.11流程控制语句,跳转语句用来实现程序执行过程中流程的转移。前面在switch语句中使用过的break语句就是一种跳转语句。C#的跳转语句有continue、break、return和goto语句。continue语句必须用于循环结构中,continue语句会使流程重新检查循环条件;break语句的作用是使程序的流程从一个语句块的内部跳转出来,执行分支或循环体后面的语句。return语句用在类的成员方法中,用来使程序流程从方法调用中返回,并提供一个表达式的值作为调用方法的返回值。goto语句中断程序的顺序流程,无条件地从一个地方跳转到另一个地方。C#语言中,goto语句有以下3种形式:goto行标号;gotocase常数表达式;gotodefault;,跳转语句,2020年4月28日,2.11流程控制语句,递归是一个过程或方法在其定义或说明中直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。递归策略是只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归调用分为直接递归和间接递归两种形式。直接递归:定义一个方法时,在方法定义内部出现了对本方法的调用。间接递归:定义两个方法时,出现了相互调用。递归具有如下4个特点。方法的定义中一定含有选择结构。一个分支为递归结束条件,另外一个分支是递归调用。通常它与某一种循环结构的功能等价,即它可以代替某一种循环。对它的分析分为回推和递推两个阶段。递归和迭代(循环)是密切相关的:能用递归处理的算法也都可以采用迭代,反之亦然。,递归调用,2020年4月28日,2.11流程控制语句,递归的主要优点是可以把算法写得比使用非递归更清晰、更简洁。下面是一个计算阶乘的示例。usingSystem;classNstaticintf(intn)if(n0|n=0)return-1;if(n=1)return1;elsereturn(n*f(n-1);staticvoidMain()Console.WriteLine(N.f(6);,
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


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

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


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