Chs 02 C#语言基础

上传人:xia****ai 文档编号:243139789 上传时间:2024-09-16 格式:PPT 页数:59 大小:465KB
返回 下载 相关 举报
Chs 02 C#语言基础_第1页
第1页 / 共59页
Chs 02 C#语言基础_第2页
第2页 / 共59页
Chs 02 C#语言基础_第3页
第3页 / 共59页
点击查看更多>>
资源描述
管理学院,击此处编辑母版标题样式,标识符是用于标记变量、常量、方法、结构、对象、类、接口等元素的字符串,这个字符串是这些元素的定义、赋值和引用时使用的唯一标识。,第二级,第三级,第四级,第五级,Web,应用开发技术 第 2 章,C#,语言基础,59,第,2,章,C#,语言基础,C#,语言及其特点,1,中间语言代码与.,NET,的跨平台,3,2,C#,的,命名空间,4,一个简单的,C#,程序,3,C#,的类和对象定义,6,C#,程序的构成,5,C#,的格式与数据类型,7,运算符与表达式,3,8,定义方法,10,方法定义与使用,9,流程控制语句,11,2.1 C#,语言及其特点,C#,读作,“,C sharp,”,,,它是,Microsoft,开发的一种用于网络开发的新语言,结,合了,C/C+,的强大功能、,Visual Basic,的易用性。,要介绍,C#,语言,不能不提到微软公司的.,NET。.NET,是一种程序和,Web,相结合的技术,它可以通过程序来动态、实时地控制页面的外观和显示的内容。,.,NET,的页面是通过程序来动态生成的,必须选择一种编程语言作为,Web,开发的脚本语言,,C#,是为其定制的作为.,NET,开发的首选语言。,C,和,C+,一直是使用最广泛的程序开发语言,它们提供了强大功能,但由于语言的复杂性给开发造成了一定的难度。,Web,应用程序开发者需要的是能快速开发,并且不用对系统平台环境考虑很多,能够把现,有的应用和,Web,标准统一的语言。,C#,正是为满足这一要求而诞生的。,C#,语言产生的背景,2.1 C#,语言及其特点,C#,是一种源自于,C,和,C+,的、简单的、完全面向对象的程序设计语言。,C#,语言虽然是从,C,和,C+,演变而来,但在一些诸如命名空间、类、方法和异常处理等特定领域进行了很大的改进与优化。,C#,它不仅适合于网络开发,也可以开发古典风格的,Windows,应用程序。,跨平台性。为了实现跨平台,,C#,采用了即时编译器(,Just In Time,JIT),,但它不是简单地移植和套用原有的,JIT,技术,而是,JIT,的发展与提升。,C#,的面向对象的程度要比,C+,还要高。,C#,中的基本类型都是基于对象的,C#,为每一个基本类型都内建了相应的类,如,Int32,是系统提供的一个类,基本类型,int,就映射为类,Int32。,而,C+,中找不到这样的内建关系,,C+,只是提供了操作这些基本类型的工具类,,int,在,C+,中并不是基于对象的。,C#,较,C+,在面向对象的开发上更简单,使用户使用起来更方便,而且,提供了非常强大的兼容性。,C#,语言的主要特征,2.1 C#,语言及其特点,C#,源于微软的,C+,,又借鉴了,Java,的一些设计方法。下面,比较,C#,与,C+,和,Java,的差异。,C#,基本继承了,C,语言的语法风格,又继承了,C+,的面向对象特征。但是,不能简单地把,C#,看成,C/C+,在.,NET,框架上的翻版。,C#,的对象模型已经面向,Internet,进行了重新设计,使用的是.,NET,框架的类库,C#,语言不再提供对指针类型的支持,程序不能访问内存地址空间;,在面向对象方面,,C#,不再支持多重继承,避免了多重继承带来的一些问题,相应的功能通过对接口的多重继承来实现。,C#,语言与,C+,比较,从程序结构上看,,C#,与,Java,极其相似,不过两者还是有明显的区别的。,Java,是通过,Java,虚拟机(,Java Virtual Machine,JVM),来实现平台的可移植性,而,C#,则是首先将源代码编译成一种中间语言(类似,Java,的字节码),执行时由公共语言运行时(,Common Language Run,CLR),的,JIT,编译器编译成本机代码;,Java,虚拟机只能执行,Java,程序,而,JIT,编译器能编译任何.,NET,框架支持的语言(包含,C#、Visual Basic、J#),编写的程序。,C#,语言与,Java,比较,2.2,中间语言代码与,.,NET,的跨平台,所谓,“,中间代码,”,是一种结构简单、含义明确的记号系统。中间代码是源程序的一种内部表示,或称中间语言。中间代码的作用是可使编译程序的结构在逻辑上更为简单明确,特别是可使目标代码的优化比较容易实现,。,什么是中间语言代码,在以往的程序开发中,对程序源代码进行编译后得到的,.,exe,文件都是为硬件所识别的机器代码,可直接运行。但是这种机器码限制了程序的可移植性,因为对于不同的计算机或者不同操作系统,,,其指令系统是不同的,这种硬件上的差异导致在不同类型的计算机上使用的计算机语言不同,需要针对不同类型的,CPU,开发不同版本的编译器。例如,在,Windows,平台上编译的程序不能在,Linux,系统上运行,除非用,Linux,系统上的编译器重新编译。,.,NET,框架上提供了一个可移植的交叉语言平台,使不同语言开发的程序可以在不同的环境、不同的,CPU,上运行。,.,NET,框架的这种跨平台程序移植能力是通过,中间语言,(,Microsoft Intermediate Language,,,MIL),来实现的。用,.,NET,框架支持的语言编写的源程序编译后生成的,.,exe,文件不能被计算机直接识别运行,这样的,.,exe,文件被称为,Microsoft,中间语言文件。本质上说,,MIL,是内存中的源程序。,2.2,中间语言代码与,.,NET,的跨平台,MIL,文件是通过.,NET Framework,的虚拟机,被称之为通用语言运行时.,NET CLR,执行。在执行的时候,,MIL,文件会自动调用,CLR,中的,JIT,再次编译,生成机器码,由计算机的,CPU,处理执行。其运行过程如下图所示。,图,C#,程序的编译执行过程,C#,生成的中间语言文件,MIL,与其他的,.,NET,语言,(,Visual Basic,、,J#,、,C+,等,),生成的,MIL,语言完全相同。由于,CLR,也是共用的,因此,不同语言开发的程序都可以在,.,NET,框架的平台上运行。,在程序执行时,,JIT,会分析中间代码并动态产出高效率的机器执行码,因此,其运行速度快;另外,,Java,虚拟机仅局限于,Java,语言程序,而,.,NET,框架中的,JIT,是语言交叉的,支持多种语言。,中间语言代码的执行,一个简单的,C#,程序,一般高级语言编程需要经过三个过程,即:,(1)源程序编辑,(2)目标程序编译生成,(3)可执行程序运行,C#,编程也不例外,也包括源程序的编辑、编译生成中间语言和解释运行中间码几个步骤。,C#,的编辑与运行,如果计算机上没有安装.,Net Framework,,那么这些程序将不能够被执行。在程序执行时,.,Net Framework,将中间代码翻译成为二进制机器码,从而使它得到正确的运行。最终的二进制代码被存储在一个缓冲区(,Buffer),中。所以一旦程序使用了相同的代码,那么将会调用缓冲区中的版本。这样如果一个.,Net,程序第二次被运行,那么这种翻译不需要进行第二次,速度明显加快。,具体来讲,,C#,程序的开发方式如下:使用任何文本编辑器(如:记事本、,Editplus,等)编写程序代码,并以.,cs,保存源文件,使用命令行编译器(,csc,.exe),进行编译;运行编译后的可执行程序文件。,2.3,一个简单的,C#,程序,下面以一个最简单的,C#,程序为例来分别介绍这三个过程。,程序,2.1,是一个最简单的,C#,程序的例子,其功能是在屏幕上输出:,“,Hello,欢迎来到,C# Word !”。,Hello.,cs,using System;,namespace,mynamespace,class,myclass,static void Main() ,Console.,WriteLine,(“Hello,欢迎来到,C# Word !);,Console.,ReadLine,();,首先引用了系统命名空间,System,,因为所有的程序都要用到该命名空间下的类。,接着创建了一个命名空间,mynamespace,在该命名空间声明并定义了一个类,mycalss,,,该类包含了一个静态的成员方法,Main(),,作为执行程序的入口。该方法调用控制台(,Console),的,WriteLine,方法输出,“,Hello,欢迎来到,C# Word !,”,。,2.3,一个简单的,C#,程序(续),建立了该,C#,程序文件后,下一步就是用.,NET,框架中包含的编译器,csc,.exe,来编,译该程序文件。编译方式如下:,csc,Hello.,cs,需要注意的是:编译器文件,csc,.exe,是在,DOS,下运行的,编译时必须进入,DOS,环,境,并且设置该执行文件所在的路径,path = C:WINDOWSMicrosoft.NETFrameworkv1.1.4322,,或,v2.0.50727,其中,v1.1.4322,和,v2.0.50727,是版本号,其中,v1.1.4322,是版本号。,C#,的编辑与运行,2.3,一个简单的,C#,程序(续),编译完成后,就可以运行该程序了。由于是控制台方式,必须在,DOS,环境下,运行,在,DOS,方式下键入,Hello,2.3,一个简单的,C#,程序(续),如果安装了,Visual Studio.NET,,那么可以在,Visual Studio .NET 2003,或,Visual Studio .NET 2005,命令提示下来执行,csc,.exe,编译器,此时,不需要再指定,csc,.exe,的路径。,Visual Studio Tools-Visual Studio 2005,命令提示,C#,编译器不仅可以生成,.exe,文件,也可以通过选项,/t:library,生成,.,dll,文件,其中的,t,的含义是,target,。,程序,2.1,中如果要生成,.,dll,文件,编译方式如下:,csc,/t:library Hello.,cs,2.3,一个简单的,C#,程序(续),如果觉得,DOS,环境下的编译太繁琐,那么,EditPlus,是一个很不错的选择,EditPlus,是一个功能强大的文本编辑器,,EditPlus,对于,HTML、CSS、PHP、ASP、,Perl,、C/C+、C#,及,VBScript,的语法突显使得它特别适合编辑文本格式的各种程序代码文件,尤其是它的,HTML,页面预览功能使得它适合编辑,HTML,文件,并且还具有,FTP,命令可以实现本地文件上传到,FTP,服务器的功能,同时它提供了支持多种语言的集成,编译、运行环境。,EditPlus,编辑、编译与运行环境,EditPlus,编译环境的设置,下面以,C#,语言为例详细说明编译环境的设置,在“工具参数选择用户工具”选项页进行设置,设置步骤如下:,设置组名称,这里也可以不设置,取缺省的设置,Group 1,单击“添加工具应用程序”按钮,进入设置界面,在菜单文本编辑框输入菜单项的名次,在命令编辑框输入编译器,(,csc,.exe),所在的路径和文件名称,各种参数可以在文本框右侧的下拉菜单中获取。,以,C#,为例,其编译环境设置参数如下:,菜单文本:编译,C#,命令:,C:WINDOWSMicrosoft.NETFrameworkv1.0.3705,csc,.exe,参数:,$(,FileName,),初始目录:,$(,FileDir,),捕获输出:开启,EditPlus,编译环境的设置(续),打开,EditPlus,文本编辑器环境后,选择,“,工具,”,“,参数选择,”,选项,打开,“,参数选择,”,对话框,选择,“,用户工具,”,选项进行设置,设置的界面如下图,所示。,EditPlus,编译环境的设置(序),设置完毕后,你就可以在“工具”菜单运行对应的工具了。编译结果会显示在底部的输出窗口,可以通过“用户工具栏”的快捷按钮编译当前编辑的文件。,在,EditPlus,下运行,C#,程序,编译完成后,可以在,EditPlus,环境下直接运行,要在,EditPlus,环境下运行已编译后的.,exe,文件,你可以进行如下设置(此时可执行文件需要和编译文件同名):,菜单文本:,C#,运行,命令:$(,FileNameNoExt,),参数:无,初始目录:$(,FileDir,),以,C#,为例,其编译环境设置参数如下:,菜单文本:,C#,编译(,.exe,),命令:,C:WINDOWSMicrosoft.NETFrameworkv1.0.3705,csc,.exe,。,参数:,$(,FileName,),。,初始目录:,$(,FileDir,),。,捕获输出:,(True),。,2.4,C#,的,命名空间,命名空间是一种松散的类的集合。,C#,中的命名空间把各种类组织在一起,使得程序功能清楚、结构分明。使用命名空间有利于实现不同程序间类的重用,也有利于类的组织、管理与使用。,一般不要求处于同一个命名空间中的类有明确的相互关系,如包含、继承等。但是由于同一命名空间中的类在默认情况下可以互相访问,所以为了方便编程和管理,通常把需要在一起工作的类放在一个命名空间中。,命名空间可以看做一个由类的集合构成的组件,(,Component),。,类库中的类和接口都必须在相应的命名空间中定义,因此程序中多个命名空间都可以含有相同的成员,却不会发生冲突。,什么是命名空间,2.4,C#,的,命名空间,将类组织在不同的命名空间的目的是为了更好地利用命名空间中的类。可以使用如下两种方式来引用命名空间中的类。,1. 使用命名空间名作为类名前缀,可以通过类的完整命名空间,(,可以看做树的节点的路径,),来唯一地定位命名空间中的任何类。比如,要引用表示文件系统的类,可以使用以下代码:,System.IO.File,System.IO,是命名空间,而,File,是特定的类。,不同的命名空间中,可以定义同名的类。例如:,namespace First,/ class A,的定义,namespace Second,/class A,的定义,两个命名空间中都定义了类,A,,,但是可以独立使用,First.A,和,Second.A,,,相互不会干扰。,命名空间的引用,2.4,C#,的,命名空间,2加载需要使用的命名空间,使用上面的方法,引用一个类时必须附加一个包含命名空间名的前缀,编程中使用起来非常麻烦。另一个解决的方法是在程序文件的开始部分利用,using,语句将需要使用的整个命名空间加载到当前程序中,这样在程序中需要引用这个类的地方就不需要再使用命名空间名作为前缀。例如:,using System;,加载一个命名空间后,凡是这个命名空间中的类,都不需要再使用命名空间名作为前缀。,例如:,using System;,namespace,mynamespace,class,myclass,static void Main() ,Console.,WriteLine,(Hello,Wellcome,to C# World!);,Console,.,ReadLine,();,2.5 C#,程序的构成,不同的程序文件虽然功能和内容不同,但都有基本统一的框架结构。下面仍以例子程序,2.1,为例来说明,C#,程序的构成。,using System;,/,加载,.,NET,框架类提供的系统命名空间,System,namespace,mynamespace,/,声明一个命名空间,mynamespace,class,myclass,/,声明一个类定义,static void Main(),Console.,WriteLine,(Hello, Welcome to C# World !);,2.5 C#,程序的构成,C#,程序的典型结构特征,C#,用,using,导入,命名空间。所有用到的类都要导入对应的命名空间。,用,namespace,关键字声明一个命名空间,每个,C#,源代码文件可以包含一个或多个命名空间。类、结构、接口等的定义必须包含在命名空间中。,C#,源程序是由类定义组成的,是类的集合。就好像任何一个,C,程序都是由若干个函数组成的一样。每个程序中可以定义若干个类,但是只有一个类是主类(包含,Main,方法的类),它是,C#,程序执行的入口点。但作为动态链接库(.,dll,),的,C#,程序的源代码文件不必要求有,Main,方法,可以由若干相互关联或独立的类构成。使用关键字,class,来定义类,每个类的定义由类头和类体部分组成。类头部分除了声明类名之外,还可以说明类的继承特性。类体部分包括属性和方法这两种类的成员。,在,C#,中不存在全局方法和变量,所有的变量和方法都包含在类的定义中。类体中通常有两种成员:一种是域,包括变量、常量、对象数组;另一种是方法,是类似于,C,中的函数的代码单元块。,2.5 C#,程序的构成,C#,程序一般都有如下的典型的框架结构,:,using System;,namespace mynamespace1 ,/,命名空间,mynamespace1,class myclass1 ,/,类定义,struct mystruct, ,/,结构定义,interface,myinterface, ,/,接口定义,delegate void,MyDelegate,(string name);,/,委托定义,enum myenum, ,/,枚举定义,namespace mynamespace2 ,/,命名空间,mynamespace2,class myclass2,/,类定义,static void Main(string,args,),/,类的,Main,方法,Console.,WriteLine,(Hello, Welcome to C# World !);,2.6 C#,的类和对象定义,下面这个例子示范如何创建和使用用户定义的类以及如何创建动态链接库。利用文本编辑器创建两个文件,。,内容如下。,第一个是,Apple.,cs,public class Apple ,private string variety = ;,public Apple(string,appleVariety,),this.variety =,appleVariety,;,public void,outputVariety,(),System.Console.,WriteLine,(variety);,首先,定义了一个新的用户定义类,Apple,我们为,Apple,类的声明加上了,public,修饰符(,public class Apple),,这样其他类就可以创建,Apple,类的实例。,接着,定义了实例变量,variety。,修饰符,private,表示只有在,Apple,类的内部才可以直接访问,variety,变量。这是一种常见的面向对象编程习惯,称为封装。,第,3,行定义了,Apple,类的构造方法,描述如何创建类实例的蓝图。构造方法总是和类具有相同的名字。,Apple,类的另一个方法是,outputVariety,(),2.6 C#,的类和对象定义,第二个文件是,Example.,cs,,,内容如下。,Example.,cs,class Example ,static void Main() ,Apple,mac,= new Apple (Macintosh );,Apple,gra,= new Apple (Granny Smith);,Apple,cor,= new Apple (Cortland);,mac,.,outputVariety,();,gra,.,outputVariety,();,cor,.,outputVariety,();,Example,类是创建并使用用户定义类,Apple,的实例。,用,new,操作符创建了3个,Apple,类的实例。创建类的实例时,,new,操作符将自动调用类的构造方法。,创建了3个,Apple,类的对象之后,依次调用这3个对象的,outputVariety,方法,由,outputVariety,方法输出这3个对象里,variety,的值。,2.6 C#,的类和对象定义,下面来编译和运行这个例子,首先要把,Apple,类编译成动态链接库:,csc,/t:library Apple.,cs,/t:library,表示不要创建执行文件,上面的命令将生成一个,Apple.,dll,文件。,接下来编译,Example.,cs,,,编译命令如下所示:,csc,/reference:Apple.,dll,Example.,cs,其中,参数,/,reference:Apple.,dll,表示,Example.,cs,要用到,Apple.,dll,中的类、属性或方法,如果,Apple.,dll,文件是保存在当前应用的,/,bin,子目录下,编译时可以省略,/,reference:Apple.,dll,参数,编译器会自动寻找所用到的,.,dll,文件。,编译后得到了执行文件,Example.exe,,,执行这个文件可以在控制台上看到如下输出,:,Macintosh,Granny Smith,Cortland,2.7 C#,的格式与数据类型,标识符是用于标记变量、常量、方法、对象、类等元素的字符串,这个字符,串是这些元素的定义、赋值和引用时使用的唯一标识。标识符由编程者自由,指定,但必须遵循一定的语法规定。,C#,对于标识符的定义有如下的规定:,标识符的首字符必须为字母、下划线或,接下来的字符可以是字母、数字或下划线。,标识符中不应使用,C,的保留字(见表2.2),如果一定要用保留字,最好使用作为前缀。,C#,是大小写敏感的语言。,class,和,Class。System,和,system,分别代表不同的标识符,在定义和使用时要特别注意这一点。,允许在标识符中使用,Unicode,转义符(见表 2.3)。,C#,的标识符,标识符实例:,下面的标识符是正确的:,myClass,_,var,BIGNUMBER,下面的标识符不正确:,6,TerOfButton,class,shoe-size,为了便于理解和阅读,应该使标识符能在一定程度上反映它所表示的变量、常量、对象或类的语义。,2.7 C#,的格式与数据类型,在书写,C#,源代码时,应遵循以下的基本规则:,每行以分号“;”结尾。,空行和缩进被忽略。,多条语句可以处于同一行,之间以分号“;”分隔即可。,注释语句有两种形式:,/,这是我的注释,/*,这是我的注释,华中科技大学,*/,C#,书写规则,注意事项,习惯,VB,的人很容易漏了语句末尾的分号,或者随便使用变量但是不声明,这在,C#,默认情况下是不允许的;,Visual Basic,中数组元素用()引用,但,C#,中数组元素要用方括号引用。,2.7 C#,的格式与数据类型,最常见的两大类数据类型是值类型和引用类型。值类型也可以称为基本数据,类型,包含简单类型,(,如整型,int,、,浮点型,float,等,),、枚举类型、结构类型,3,种。,基本数据类型是,C#,语言中提供的、无法再分解的一种预定义类型,引用类型包含的数据类型有字符串类型、数组类型、类类型、对象类型、接口类型和代理类型。,表,2.4,列出了,C#,中定义的所有数据类型,可以看出,C#,的数据类型的设置与,C,语言相近,但,C#,对其数据类型的取值范围作了扩充。其中,string,和,object,类,型是引用类型,其他的都是基本数据类型。,C#,的数据类型,需要说明的是:,C#,的字符数据类型,char,与其他语言相比有较大的改进。,C,语言等的字符类型是采用,ASCII,编码,。,C#,的字符类型采用了一种新的国际标准编码方案,即,Unicode,编码。共可表示65535个不同的,Unicode,字符,无论东方字符还是西方字符都可以统一用一个字符表达。引用类型,string,表示,Unicode,字符序列。,2.7 C#,的格式与数据类型,C#,语言是强制类型语言,编译器会自动检测程序代码中的数据类型是否相容,如果不相容则自动进行数据类型转换。,编译器能够自动进行的数据类型转换称为,隐式转换,。隐式转换不会发生数据的损失,也无须程序设计人员介入,由系统自动完成。,例如,将,byte,类型的值赋给,int,变量时,系统会自动将其转换为,int,类型。,byte bb = 50 ;,int,ii = bb ;,通常,从小值域范围的类型,(,如,short),到大值域范围的类型,(,如,int,、,long),系统会自动,进行隐式转换。,C#,的数据类型转换,2.7 C#,的格式与数据类型,如果编译器不能完成隐式转换,就需要用户进行数据类型的,显式转换,。,C#,语言的数据类型显式转换有以下3种方式。,1,使用强制类型转换运算符,“()”,转换格式为:,(,类型,),数据,;,例如,,ii,是,int,类型,要将其转换为,short,类型,可使用下面的强制类型转换语句:,int,ii = 50 ;,short,ss,= (short)ii ;,C#,的数据类型转换,2.7 C#,的格式与数据类型,2,使用,System.Convert,类的静态成员方法,Convert,类位于命名空间,System,中,其静态方法如表,2.5,所示,。,例如:,int,ii = 100;,string,str,= System.Convert.,ToString,(ii) ;,3,使用,.,NET,框架提供的,Parse(),方法,在,.,NET,中,每种基本数据类型都定义了相应的结构,结构都封装了与名称对应的数据类型,并且带有一个静态的,Parse(),方法,用于相应的类型转换。,例如:,float f = 200;,string s = f.,ToString,() ;,C#,的数据类型转换,2.7 C#,的格式与数据类型,2,使用,System.Convert,类的静态成员方法,Convert,类位于命名空间,System,中,其静态方法如表,2.5,所示,。,例如:,int,ii = 100;,string,str,= System.Convert.,ToString,(ii) ;,3,使用,.,NET,框架提供的,Parse(),方法,在,.,NET,中,每种基本数据类型都定义了相应的结构,结构都封装了与名称对应的数据类型,并且带有一个静态的,Parse(),方法,用于相应的类型转换。,例如:,float f = 200;,string s = f.,ToString,() ;,C#,的数据类型转换,2.7 C#,的格式与数据类型,常量是在程序运行过程中保持不变的量。常量有,直接常量,和,符号常量,。,直接常量是在程序中直接书写的数值或字符串等,,如,123,、,66.88,,,“,This is a message for C#”,。,符号常量是用,const,修饰的、具有特定值的标识符,其声明方式为:,const,类型,常量名,=,初始值,;,例如:,const double pi = 3.1415926;,const string,univName,= “HUST” ;,符号常量必须在声明的时候赋初值,而且一旦初始化后,就不能再赋值。,C#,中常用的常量有布尔常量、整型常量、字符常量、字符串常量和浮点常量。,C#,常量,2.7 C#,的格式与数据类型,1,布尔常量,布尔常量包括,true,和,false,,,分别代表真和假。而在,C#,中,,bool,类型不能与其他数据类型转换。,2,整型常量,整型常量可以用来给整型变量赋值。如,-386,L,、,017777l,。,3,浮点常量,浮点常量表示可以含有小数部分的数值变量。可以分为一般浮点常量,float,类型和双精度浮点常量,double,类型两种。浮点常量用,F,、,f,表示,如,32.4,F,、,543.62f,;,双精度浮点常量用,D,或,d,表示,如,700041.273,d,或,700041.273,,系统默认其为双精度浮点常量。浮点常量还有指数表示法,如,3.0513,E3,是指数形式表示的常量。,4,字符常量,字符常量用一对,单引号,括起的单个字符表示。如,a,、,Z,、,8,、,#,,,也可以是要表示的字符所对应的,Unicode,码。,5,字符串常量,字符串常量是用,双引号,括起的一串若干个,Unicode,字符。双引号必须在源代码的同一行上。可以使用连接操作符,(+),把两个或更多的字符串常量串接在一起组成一个更长的字符串。例如:,How do you do?,+,n,2.7 C#,的格式与数据类型,变量是在程序的运行过程中数值可能发生变化的数据,通常用来记录运算中间结果或保存数据。,C#,中的变量必须先声明后使用,声明变量包括指明变量的数据类型和变量的名称,必要时还可以指定变量的初始数值。变量的声明格式如下。,访问修饰符,数据类型,变量名,=,初始值,;,变量声明是一个完整的语句,所以它与其他,C#,语句一样需要用分号结束。,例如:,int,size=5;/,声明整数型变量,size,,,并对其初始化,float f;/,声明浮点型变量,f,f=4.67f;/,给变量赋值,C#,的,变量,2.7 C#,的格式与数据类型,变量的命名应遵循标识符命名规则,变量声明时可以直接给变量赋初值。在,C#,中要求对变量明确赋初值,使用未初始化的变量会导致编译错误。如果变量声明时没有给变量赋初值,变量会带有表,2.7,所示的默认的初始值。,变量的定义举例如下:,int,ii = 1;,string,cname,= “RMIT University”;,Boolean married = true;,C#,的,变量,C#,的变量有一定的生存期和有效范围。,C#,变量的有效范围就是声明它的语句所在的语句块,一旦程序的执行离开了这个语句块,变量就变得没有意义了。例如:,int,sum=0;,for(,int,i=0;i10;i+),sum+=i;,/,在这对,之外,,sum,不存在了,C#,程序代码可以看做类的集合,不能在类之外声明任何的变量和方法,因此在,C#,中不存在类似其他语言中的全局变量。,2.7 C#,的格式与数据类型 枚举与数组,枚举类型的取值范围是有限的,可以一一列举,例如星期、月份、员工的性别等,实际上枚举可看成是一组相关的符号常量的集合。,C#,语言中,枚举类型使用关键字,enum,声明,其语法格式如下:,访问修饰符,enum,类型名,:,基类型, ,枚举值列表,其中,基类型表示枚举值的基本类型,默认类型是,int,。,枚举值列表之间用逗号,“,,,”,分割,对于枚举值的访问必须用枚举类型名进行限定。例如,下面定义了一个,Week,的枚举:,enum,Week Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday,值得注意的是枚举类型值与整型之间要进行显式的转换。例如:,int,w = (,int,)Weeks.Saturday;,默认情况下,枚举的第一个常数的值初始化为0,后面的值初始化为前面的值加1。例如,上面的,Week,枚举中,Sunday,值为 0,Monday,值为 1,Tuesday,值为 2,Wednesday,值为 3,Thursday,值为 4,Friday,值为 5,Saturday,值为 6。也可以使用赋值语句改变枚举中常数的初始值。例如,上面的,Week,枚举可以表示为:,enum,Week,Sunday,Monday = 10,Tuesday,Wednesday,Thursday,Friday,Saturday,上面的,Weeks,枚举中,Sunday,值为 0,Monday,值为 10,Tuesday,值为 11(前面的,Monday,值加 1),Wednesday,值为 12,依此类推,,Saturday,的值为 15。,C#,的枚举,2.7 C#,的格式与数据类型 枚举与数组,数组是一种常用的数据结构,相同数据类型的元素按一定顺序线性排列就构成了数组,它包含若干个数组元素。数组元素可以通过索引进行访问,,C#,数组从,0,开始建立索引,即数组元素索引从,0,开始,最后一个数组元素的索引为数组长度减,1,。在,C#,中数组的元素可以是简单数据类型,也可以是其他任何类型,包括数组类型。,创建一个,C#,数组需要下面,3,个步骤。,步骤,1,:声明数组,声明数组的语法格式有两种:两种定义方法没有什么差别。,数组元素类型,数组名, ;,数组元素类型, ,数组名,;,方括号 是数组的标志,例如:,int MyIntArray,;,string,MyStrArray,;,C#,的数组,2.7 C#,的格式与数据类型 枚举与数组,步骤2:创建数组空间,声明数组仅仅指定了数组的名字和数组元素的类型,还需要为它开辟内存空间。,C#,不支持变长的数组,所以在创建数组空间时必须指明数组的长度,以确定所开辟的内存空间的大小。创建数组空间的语法格式如下:,数组名,=,new,数组元素类型,数组元素的个数,;,上面的两个数组可以这样创建空间:,MyIntArray,= new,int,10,;,MyStrArray,= new string15,;,创建数组空间的工作也可以与声明数组合在一起,用一条语句完成。例如:,int MyIntArray, = new,int,10,;,string,MyStrArray,= new string15,;,如果直接在数组声明时指定数组的长度,则编译时会出现错误。如:,int,100,MyIntArray,;,/,是错误的,2.7 C#,的格式与数据类型 枚举与数组,步骤3:创建数组元素并初始化,可以在数组声明时直接对数组进行初始化。例如:,int,MyIntArray,= new,int, 0,1,2,3,4,5,6,;,string,MyStrArray,= new string “Red”,“Green”,,,“Blue”,;,也可以使用下面的简写方式:,int,MyIntArray,= 0,1,2,3,4,5,6,;,string,MyStrArray,= “Red”,“Green”,,,“Blue”,;,C#,数组时需要注意的几个问题。,数组元素的索引从0开始。例如长度为10的数组,其元素下标为09。,所有的数组都有一个属性,length,,这个属性存储了数组元素的个数。,C#,系统能自动检查数组索引是否越界的情况。避免这种情况出现的一个有效方法是利用上面提到的,length,属性作为数组索引的上界。,2.7 C#,的格式与数据类型 枚举与数组,数组使用的例子如例子程序,。,程序2.2:,MyArray,.,cs,using System;,namespace,mynamespace,class Class2,public static string Colors = Red,Green,Blue,White,Yello,;,static void Main(),for (,int,ii=0;ii Colors.Length ;ii+),Console.,WriteLine,(Colors ii);,2.8 运算符与表达式,C#,的运算符与,C+,语言基本类似。表,2.8,列出了,C#,的所有运算符。,C#,运算符,运算符类别,运算符,算术运算,+ - * / %,逻辑运算,& | ! & |,true false,字符串连接,+,自增、自减,+ -,关系运算,= != =,赋值运算,= += -= *= /= %= &= |= =,成员访问,.,索引,转换,(),条件,?:,创建对象,new,2.8 运算符与表达式,表达式,是由变量、常量、对象、方法和运算符等按一定规则组成的式子。表达式的含义与数学上的表达式基本相同。,表达式的值就是对它运算后所得的结果。符合语法规则的表达式可以被编译系统理解、执行或计算。例如:,55 + 25 /其值等于80,15 +,System.Math.,Sqrt,(16) /,值等于19,System.Math.,sqrt,(x+y+z)*(x+y)2),如果表达式包含多个运算符号,那么它们的计算顺序由运算符的优先级,(,见表,2.10),决定,要改变表达式中的运算顺序可在表达式中使用圆括号。,C#,表达式,2.9 方法定义与使用,在,C#,语言中,不存在全局方法,所有的方法都只能存在于类,(,或结构,),中,并以类的成员方法,(,Method),的形式出现。,C#,程序可以看成类的集合,只能通过类才能对变量和方法进行访问。,例如,计算表达式 1 + 2 + 3 + +,n,的总和,在,C,和,C+,中,可以定义一个全局方法,如下:,long Sum(,int,n),int,s = 0 ; /,定义一个累加器,初值为 0,for (,int,ii = 1; ii = n; ii+), s += ii ; ,return s ;,然后在代码中调用该方法即可:,long s = Sum(n) ;,2.9 方法定义与使用,在,C#,中不存在独立的方法,所有的方法都必须在类中声明和实现。因此,在,C#,中,上述方法可以改为以下形式:,public class,sumClass,/,声明一个类,并定义类的实体,public static sums ; /,声明一个公共静态属性,public static long Sum(,int,n),/,类的静态成员方法,int,s = 0 ; /,定义一个累加器,初值为 0,for (,int,ii = 1; ii = n; ii+),s += ii ;,sums = s;,然后,通过访问类的成员方法来调用该方法,例如:,long s =,sumClass,.Sum(100) ;,2.9 方法定义与使用,由于,C#,是完全面向对象的,原有的,C,和,C+,中大量的系统方法都是以类的成员方法的形式出现的。,常用的数学方法以静态成员方法的方式封装在,Math,类中,该类处于,System,命名空间中。由于是静态的,所以调用时无须实例化,Math,类,可以通过,Math.,方法名,(),的形式调用该类中的方法,就像使用全局方法一样。,using System;,namespace,mynamespace,class,myclass,static void Main(),Console.WriteLine(Math.E);,Console.WriteLine(Math.PI);,Console.WriteLine(Math.Sqrt(100);,如果未导入命名空间,则应使用类的完整路径。例如,:,System.Math.E;,System.Math.PI;,System.Math.Sqrt(100);,Math,中的常用数学方法见表2.11。,2.10 定义方法,方法定义由4个部分组成,修饰符:,public、static,等,用来描述方法的特性,本书将在后面讨论。,方法返回值类型:,void、,int,等。,方法名和参数列表:,Print(string s)。,由花括弧括起的要执行的代码块,即方法体。,程序2.3:,PrintClass,.,cs,using System;,namespace,mynamespace,class,PrintClass,static void Print(string s),Console.,WriteLine,(s);,static void Main() ,Print(Hello, come and join us!);,1返回值,Print,与,Main,两个方法都使用了,void,,表示方法不返回任何值。方法的返回类型就必须与返回值的类型一致。,2,参数列表,方法名后的圆括弧中可以带任意个参数,其类型必须与传入数据的顺序、类型和个数一一对应,否则会发生调用错误。,2.11 流程控制语句,流程控制语句是用来控制程序中各语句执行顺序的语句。流程控制是程序中非常关键和基本的部分,流程控制语句可以把单个的语句组合成有意义的、能完成一定功能的逻辑模块。,任何程序都可以且只能由三种基本流程结构构成,即顺序结构、分支结构和循环结构,这,3,种结构构成了程序局部模块的基本框架。,顺序结构是程序设计语言的最基本、最简单的一种结构,即语句按照书写的顺序依次执行。,分支结构又称为选择结构,它将根据计算所得的表达式的值来判断应选择执行哪一个流程的分支。,循环结构则是在一定条件下反复执行一段语句的流程结构,递归调用可以看做循环结构的一种特殊形式。,2.11 流程控制语句,C#,中的分支语句有两种形式:一种是负责实现双分支的,if,语句,另一种是负责实现多分支的开关语句,switch,。,if,语句,if,语句的一般形式是:,if (,条件表达式), /,if,分支,else, /else,分支,分支语句,如果条件表达式的取值为真,(,true),,,则执行,if,分支的语句块;如果条件表达式的取值为假,(,false),,,则执行,else,分支的语句块。,也可以没有,else,分支,此时若条件表达式的取值为假,则绕过,if,分支直接执行,if,语句块后面的其他语句。语法格式如下:,if(,条件表达式,), /,if,分支,如果语句块内只有一个语句,此时,可不用大括号,。,下面是一个,if,语句的最简单例子,其功能是求,x,的绝对值。,if (x b) ,if (a c),max = a;,else,max = c;,else,if (b c),max = b;,else,max = c;,Console.,WriteLine,(3,个数中最大值是: +,max.,ToString,();,return max;,2.11 流程控制语句,switch,语句,switch,语句是多分支的开关语句,它的一般格式如下:,switch (,条件或变量表达式,),case option1:,break;,case option2:,break;,default,:,break;,需要注意的是,,switch,语句的每一个,case,判断,都只负责指明流程分支的入口点,而不负责指定分支的出口点,分支的出口点需要编程人员用相应的跳转语句来标明。,所以每个分支的语句块最后一个语句应该是流程跳转语句,“,break;,”,,,它的作用是跳转出整个,switch,语句。,2.11 流程控制语句,int,n;,string,sweek,;,switch (n),case 1:,sweek,=“,星期一”;,case 2:,sweek,=“,星期二”;,case 3:,sweek,=“,星期三”;,case 0:,sweek,=“,星期日”;,假设变量,n,的值为,1,,执行完,switch,语句后,变量,sweek,的值被赋成什么呢,?,是,“,星期日,”,,而不是,“,星期一,”,。因为,case,判断只负责指明分支的入口点,表达式的值与第一个,case,分支的判断值相匹配后,程序的流程进入第一个分支,将,sweek,的值置为,“,星期一,”,。,由于没有专门的分支出口,所以流程将继续沿着下面的分支逐个执行,,sweek,的值依次被置为,“,星期一,”,、,“,星期二,”,,最后变成,“,星期日,”,。如果希望程序的逻辑结构正常完成分支的选择,则需要为每一个分支另外编写退出语句,break;,。,2.11 流程控制语句,为什么,C#,的,switch,的每个分支需要增加一个,break,呢?这是因为在某些情况下,,switch,语句的这个只有分支入口、没有出口的功能也有它独特的适用场合。如在若干判断值共享同一个分支时,就可以实现由不同的判断语句流入相同的分支。,下面的例子是根据学生的成绩判断是否及格与不及格:,switch (,stGrade,),case,A,:,case,B,:,case,C,:,stScore,=,“,及格,”,;,break ;,default:,stScore,=,“,不及格,”,;,2.11 流程控制语句,循环结构是在一定条件下,反复执行某段程序的流程结构,被反复执行的程序被称为循环体。,循环结构是程序中非常重要
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 小学资料


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

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


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