资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,2007/1/29,#,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,DATE yyyy年M月d日|2007年1月29日,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,DATE yyyy年M月d日|2007年1月29日,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,DATE yyyy/M/d|2007/1/29,#,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,DATE yyyy/M/d|2007/1/29,#,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,DATE yyyy/M/d|2007/1/29,#,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,DATE yyyy/M/d|2007/1/29,#,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,DATE yyyy/M/d|2007/1/29,#,C#,程序设计,第,1,章,Visual Studio 2008,简介,为了便于复杂程序开发,开发人员将数据和与之相关的运算打包到一起,统一考虑,从而形成了类。类实际就是数据和相关处理的代码的封装体。它也构成了面向对象编程的核心。本章将给大家详细讲解,C#,语言中的类的用法。,1.1 .NET,框架,.NET,框架(,.NET Framework,)由微软开发,是一个致力于敏捷软件开发(,Agile software development,)、快速应用开发(,Rapid application development,)、平台无关性和网络透明化的软件开发平台。,NET,框架的目的是便于开发人员更容易地建立,Web,应用程序和,Web,服务,使得,Internet,上的各应用程序之间可以使用,Web,服务进行沟通。,1.1.1 .NET,框架,.NET,框架是一个多语言组件开发和执行环境,它提供了一个跨语言的统一编程环境。从层次结构来看,,.NET,框架又包括三个主要组成部分:通用语言运行时(,CLR,,,Common Language Runtime,)、基类库(,Base Class Library,)和上层的两类应用模板,Windows,应用程序模板(,Win Forms,)和基于,ASP NET,的网络应用程序模板(,Web Forms,和,Web Services,),1.1.1 .NET,框架,图,1-1 .NET,框架,1.,公共语言运行库,(CRL),通用语言运行时(,CLR,)提供了程序代码可以跨平台执行的机制,是,.NET,框架的核心。当使用,.NET,程序设计语言编写好程序代码后,它会被编译两次。第一次是将程序代码和基础类组合编译成中间语言(,IL,,,Intermediate Language,),第二次是在执行时,,CLR,会将中间语言(,IL,)编译成运行平台的,CPU,可以执行的本地代码,如同,1-2,所示。正是这样的运行模式,使得,.NET,平台框架开发出来的程序可以在在任何具有,CLR,的平台上执行,实现一次编写,到处运行。,1.,公共语言运行库,(CRL),图,1-2 .NET,程序的两次编译,2.,基类库,CLR,的上层是,.NET,的基类库,它提供一个可以供不同编程语言调用的、分层的、面向对象的函数库。这组基类库包括从基本输入输出到数据访问等各方面,提供了一个统一的面向对象的,层次化的,可扩展的编程接口。,3.NET Framework,类库,.NET Framework,类库是一个与公共语言运行库紧密集成的可重用的类型集合,用于应用程序开发的一些支持性的通用功能。主要包括以下类库:数据库访问(,ADO.NET,等)、,XML,支持、目录服务(,LDAP,等)、正则表达式和消息支持。,4.,应用程序开发技术,.NET,框架的最上层是应用程序,可以分为面向网络应用的,ASP.NET,程序和面向,Windows,系统的,Windows,应用程序,这两类应用程序均可使用,C#,、,VC+.NET,、,VB.NET,等来编写。,1.1.2 .NET,框架版本,.NET1.0,发行于,2002,年,被称作,Visual Studio.NET 2002,。,.NET,框架,1.1,发行于,2003,年,被称作,Visual Studio.NET 2003,。,.NET,框架,2.0,发行于,2005,年,10,月,,.NET,框架,2.0,的组件都包含在,Visual Studio 2005,和,SQL Server 2005,里面。,.NET,框架,3.5,发行于,2007,年,增加了对支持,AJAX,和,LINQ,(,Language-Integrated Query,)的支持,该版本随,Visual Studio 2008,一起发布。,.NET,框架,4.0,主要增加了并行支持,英文版于,2010,年,4,月,12,日推出。,1.2 C#,语言,C#,语言是一种面向对象的程序设计语言,是微软,.NET,公共语言运行环境中内置的核心程序设计语言。使用,C#,语言可以开发在,.NET Framework,上运行的多种应用程序,包括:控制台应用程序、,Windows,窗体应用程序、,Web,应用程序以及,Web,服务等。,1.2 C#,语言,C#,语言的主要特点如下:,1,语法简洁,2,支持跨平台,3,面向对象,4,完整的安全性,5,语言的兼容性和灵活性,6,与,Web,完美结合,7,版本可控,1.3 Visual Studio 2008,编程环境,Microsoft Visual Studio 2008,是面向,Windows Vista,、,Office 2007,、,Web 2.0,的下一代开发工具,代号“,Orcas,”,你可以理解为一个功能强大的编辑器。,1.3.1 Visual Stdio 2008,的新特性,Visual Stdio 2008,引入了,250,多个新特性,整合了对象、关系型数据、,XML,的访问方式,语言更加简洁。,1,.NET Framework,对重定向的支持,2,ASP.NET AJAX,和,JavaScript,智能客户端支持,3,全新的,Web,开发体验,4,编程语言方面的改进和,LINQ,5,浏览,.NET Framework,库源码,1.3.2 Visual Studio 2008,的安装,1,Visual Studio 2008,的环境要求,Visual Studio 2008,对系统环境有较高的要求。,(,1,)硬件要求,中央处理器(,CPU,):建议采用,1GHz,或以上,32,位(,x86,)或者,64,位(,x86,)处理器。,内存:至少配置为,1GB,(,32,位),推荐,2GB,(,64,位)内存以上。,硬盘:,20GB,硬盘(,32,位)或,40GB,硬盘(,64,位)以上可用硬盘空间。,显示器:推荐配置,1024768,分辨率以上的全彩显示器,以便方便地显示开发环境提供的多个不同功能窗口等。,1.3.2 Visual Studio 2008,的安装,1,Visual Studio 2008,的环境要求,(,2,)软件要求,操作系统:,Windows7,、,Windows Vista,或,Windows XP,。,2,Visual Studio 2008,的安装,1.4,创建,C#,项目,C#,可以用于创建控制台(,Console,)应用程序:仅使用文本、运行在,DOS,窗口中的应用程序。由于控制台应用程序结构比较简单,在程序设计语言的语法学习阶段使用这类程序作为实例,将有助于简化问题的讨论,所以我们将以控制台程序为例讲解创建,C#,程序的过程。,1.4.1 C#,控制台应用程序的创建步骤,在,Microsoft Visual Studio 2008,(简称为,VS2008,,以下皆同)中创建一个,C#,控制台应用程序的主要步骤如下:,(,1,)启动运行“,Microsoft Visual Studio 2008,”;,(,2,)选择项目类型为控制台应用程序,并指定项目名称及其保存位置;,(,3,)在应用程序编辑环境中输入程序代码;,(,4,)调试运行程序。,1.4.3 C#,控制台应用程序的结构,一个,C#,控制台应用程序主要由以下几部分构成。,1,导入其他系统预定义元素,高级程序设计语言总是依赖许多系统预定义元素,为了在,C#,程序中能够使用这些预定义元素,需要对这些元素进行导入。上例创建的控制台应用程序中,使用下述代码段导入了对其他命名空间的引用:,using System;,using System.Collections.Generic;,using System.Linq;,using System.Text;,1.4.3 C#,控制台应用程序的结构,一个,C#,控制台应用程序主要由以下几部分构成。,1,导入其他系统预定义元素,高级程序设计语言总是依赖许多系统预定义元素,为了在,C#,程序中能够使用这些预定义元素,需要对这些元素进行导入。使用下述代码段导入了对其他命名空间的引用:,using System;,using System.Collections.Generic;,using System.Linq;,using System.Text;,2,命名空间,C#,程序是用命名空间来组织代码,使用关键字,namespace,和命名空间标识符(命名空间名字)构建用户命名空间,空间的范围用一对花括号限定,如下所示:,namespace Hello/,默认情况下命名空间名与解决方案名相同,1.4.3 C#,控制台应用程序的结构,3,类,类必须包含在某个命名空间中(例如,namespace Hello,),使用关键字,class,和类标识符(类名,默认为,Program,)构建类,类的范围使用一对花括号限定,如下所示:,class Program,1.4.3 C#,控制台应用程序的结构,4,Main(),方法,每个应用程序都有一个执行的入口,指明程序执行的开始点。,C#,应用程序的入口点用,Main(),方法标识,程序的执行总是从,Main(),方法开始,后面的括号中即使没有参数也不能省略。,一个,C#,应用程序必须有、而且只能有一个,Main(),方法。,1.4.3 C#,控制台应用程序的结构,5,方法中的,C#,代码,在方法体(方法的左右花括号之间)中书写实现方法逻辑功能的代码。,1.4.3 C#,控制台应用程序的结构,1,严格区分大小写,C#,是一种大小写敏感的语言,字母大小写不同的标识符被视为不同的标识符。例如“,name,”和“,Name,”在,C#,中就是不同的标识符。,1.4.4 C#,程序代码的基本语法规则,2,语句书写规则,(,1,)每个语句都必须用一个分号(,“,;,”,)作为结尾。,(,2,),C#,是一种块结构的编程语言,所有的语句都是代码块的一部分。每个代码块用一对花括号(,“”,、,“”,)来界定,花括号本身不需要使用分号来结束。一个代码块中可以包含任意多行语句,也可以嵌套其它代码块。,(,3,)标点符号必须是英文标点符号。,(,4,),C#,允许在同一个代码行上书写多个语句。,(,5,)作为目前通行的程序代码标准书写规则,代码块的书写广泛采用了缩进格式,1.4.4 C#,程序代码的基本语法规则,3,注释信息,注释信息是程序中不参与执行的部分,仅用于对程序代码加以说明,编译时会将其完全忽略。恰当地使用注释有助于提高程序的可读性,便于软件维护和协作开发。,(,1,)单行注释,每一行中双斜杠,“/”,后的任何内容均作为注释信息,该方式只对本行生效。,(,2,)多行注释,从,“/*”,开始,到,“*/”,结束,其中的所有内容(可以是一行,或多行)均为注释信息,但注释文字中必须不包含,“*/”,。,1.4.4 C#,程序代码的基本语法规则,1.4.5,控制台输入,/,输出,通常编写的程序都需要实现一种交互:程序接收一定的数据输入,并对所输入的数据进行处理,最后将处理的结果反馈给用户,也就是输出。,1,Console.WriteLine(),方法,WriteLine,()方法的作用是将信息输出到控制台,并在信息的后面添加一个回车换行符来产生一个新行。,1.4.5,控制台输入,/,输出,2,Console.Write(),方法,Write(),方法和,WriteLine,()方法类似,都是将信息输出到控制台,但,Write(),方法输出信息到屏幕后并不产生一个新行,即换行符不会连同输出信息一起输出到屏幕上,光标将停留在所输出信息的末尾。,1.4.5,控制台输入,/,输出,3,Console.ReadLine(),方法,ReadLine,()方法用来从控制台读取一行数据,一次读取一行字符的输入,并且直到用户按下,Enter,键才会返回,但,ReadLine,()方法并不接收,Enter,键。如果,ReadLine,()方法没有接收到任何输入,或者接收了无效的输入,那么,ReadLine,()方法将返回,null,。,1.4.5,控制台输入,/,输出,4,Console.Read(),方法,Read,()方法的作用是从输入流(控制台)读取下一个字符,,Read,()方法一次只能从输入流读取一个字符,并且直到用户按,Enter,键才会返回。当这个方法返回时,如果输入流中包含有效的输入,则返回该字符对应的,Unicode,编码十进制值;如果输入流中没有数据,则返回,-1,。,如果用户输入了多个字符,则,Read,()方法只返回用户输入的第,1,个字符,但是,用户可以通过多次调用,Read,()方法来获取所有输入的字符。,主 编 鲁 立 张松慧,中国水利水电出版社,2.1 数据类型,数据类型是程序设计的基础,在进行程序设计时,必须让计算机了解需要处理的是什么数据,以什么方式保存和显示数据。为此,C#定义了很多数据类型,对程序中声明的保存信息的变量必须说明它的数据类型。本节主要介绍常用的数据类型及其基本用法。,第2章 变量与表达式,2.1.1 数据类型的分类,C#提供的数据类型可以分为两大类,一类是值类型,另一类是引用类型。,值类型又划分为简单类型、枚举类型和结构类型;引用类型则分为类类型、接口类型、数组类型和委托类型。,2.1.2 值类型,值类型是一种表示实际值的数据类型,C#的值类型包括:简单类型、枚举类型和结构类型3种。,1.简单类型,C#提供已经定义好的简单类型,包括:整型、实型、布尔型和字符型。,(1)整型,整型是指数据的值是整数。根据变量在内存中所占的位数不同,C#语言提供8中整型分别是:短字节型(sbyte)、字节型(byte)、短整型(short)、无符号短整型(ushort)、整型(int)、无符号整型(uint)、长整型(long)、无符号长整型(ulong)。这些不同的整型用来存储不同范围的数值,占用不同的内存空间,,数据类型,取值范围,说明,类型指定符,sbyte,-128127,1字节有符号整数,byte,0255,1字节无符号整数,short,-3276832767,2字节有符号整数,ushort,065535,2字节无符号整数,int,-21474836482147483647,4字节有符号整数,uint,04294967295,4字节无符号整数,U,long,-9223372036854775808,9223372036854775807,8字节有符号整数,L,ulong,018446744073709551615,8字节无符号整数,UL,(2)实型,实数类型是一种同时使用整数部分和小数部分表示数值的类型,分为单精度(float)、双精度(double)和小数型(decimal),它们的区别在于取值范围和精度不同。计算机对实数的运算能力大大低于整数,单精度类型常用于对精度要求不高的计算,对结果要求精确的使用双精度型,decimal类型适合用于财务和货币计算。,数据类型,取值范围,说明,类型指定符,float,1.510,-45,3.410,38,4字节单精度实数,F,double,5.010,-324,1.710,308,8字节双精度实数,D,decimal,1.010,-28,7.910,28,16字节实数,M,(3)布尔型,布尔型(bool数据类型)是只有true和false2个无符号值的类型。如果变量只能表示“是/否”或“真/假”信息的,则将它定义为bool类型;可以将布尔型值赋值给布尔型变量,(4)字符类型,字符类型用char表示,为单个Unicode字符,一个Unicode字符是2个字节长度;字符包括数字字符、英文字符、表达符号等等,字符型的变量可以用单引号引起来的字符常量直接赋值;不包含任何字符的字符串,称为空字符串。,C#中提供转义符,用来表示单引号和反斜杠等特殊的字符常数,在需要表示这些特殊常数的位置,使用这些转义符来代替字符。常用转义符如表2-3所示。,表2-3 常用转义符,转义符,字符名称,单引号,双引号,反斜杠,0,空字符,a,发出一声响铃,b,退格,r,回车,n,换行,2.结构类型,程序设计中,往往需要一些复杂的数据类型来表示数据。C#中使用结构类型(Structure)把多个不同类型的数据组合到一起。结构类型可以定义常数、字段、属性、方法、索引器、操作符和嵌套类型,使用结构类型的优点是节省内存空间,可以不使用继承或引用标示。,结构体是一种复合的数据类型,它允许用其他数据类型构成一个结构类型,而一个结构类型变量内的所有数据可以作为一个整体进行处理。,定义结构类型的语法如下:,struct 结构体标示符,public 类型 成员变量名1;,public 类型 成员变量名2;,public 类型 成员变量名3;,.,;,3.枚举类型,枚举是这样的种数据类型:它的值有固定的范围,在逻辑上是密不可分的整数值,这些值可以用有限个常量来叙述,例如:星期、月份等。枚举类型使用关键字enum定义,语法如下:,enum 枚举名,标示符1=整型常数,标示符2=整型常数,标示符3=整型常数,标示符4=整型常数,.,2.1.3 引用类型,引用类型又称对象,引用类型是不直接存储变量值的,存储的是引用值的地址。使用时,引用也可以为null,这表示当前不引用或不指向任何对象。C#的引用类型有类、数组、委托和接口4种。这里简单介绍object(对象类型)和string(字符串类型)两个类。,2.1.4 类型转换,在C#中,有些数据类型可以转换为另一种数据类型。,如果是一种值类型转换为另一种值类型,或者一种引用类型转换为另一种引用类型,比较常用的转换方式是:隐式转换与显式转换。对于不同值类型之间的转换,可以使用Convert类提供的静态方法。,1.隐式转换,隐式转换就是将低精度数值转换为高精度数值,转换顺序如表2-4所示。若,两种变量类型是兼容的或目标类型的取值范围大于源类型,这样的类型转换就由系统自动完成。例如:,int a=100;/定义整型变量a并赋值,float b=a;/整型变量a隐式转换为浮点数赋值给b,表2-4 隐式转换源类型与目标类型对应表,源类型,可以转换的目标类型,sbyte,short、int、long、float、double、decimal,byte,short、ushort、int、uint、long、float、double、decimal,char,ushort、int、uint、long、float、double、decimal,int,long、float、double、decimal,uint,long、ulong、float、double、decimal,short,int、long、float、double、decimal,ushort,int、uint、long、float、double、decimal,long,float、double、decimal,ulong,float、double、decimal,float,double,2.显式(强制)转换,在不满足隐式转换的情况下,必须使用显式(强制)转换。显式(强制)转换是一种指令,该指令通过编译器强制将一种类型转换为另一种类型。语法为:,(目标类型)变量或表达式,例如:,int a=65;/定义整型变量a并赋值,short b=(short)a;/将a强制转换为短整型,char c=(char)a;/将a强制转换为字符型,3.Convert类,C#的Convert类提供多种方法来进行显式(强制)转换,语法为:,目标类型=Convert.转换方法(源类型),例如:,int num;/定义整型变量num,num=Convert.ToInt16(78);/将字符串78强制转换为整型并赋值给num,4.ToString()方法,ToString()方法主要用于将一些类型的变量转换为字符串类型。语法为:,变量名.ToString(),例如:,int a=100;,string s=a.ToString();,字符串变量s的值为100。,5.Parse()方法,Parse()方法用于将特定格式的字符串转换为数值类型。语法格式为:,数值类型名.Parse(字符串表达式),但是,语法格式中的“字符串表达式”的值必须符合“数值类型名”对应的数值格式要求。例如:,int x=int.Parse(123);/将123转换为整型赋值给x,int y=int.Parse(123.4);/因为123.4不符合整型的格式,所以转换失败,int y=float.Parse(123.4);/因为123.4符合浮点数型的格式,所以转换成功,2.1.5 装箱与拆箱,对于值类型与Object类型之间的转换,可以用装箱和拆箱技术来实现。,C#的类型系统是统一的。它使值类型可以被看成是对象,装箱转换允许将值类型隐式转换为引用类型。装箱的过程是:首先分配一个对象实例,然后将值类型的值复制到实例中。拆箱过程是:首先检查对象实例是否为给定值类型一个装了箱的值,然后将该值从实例中复制出来。,1.装箱,装箱操作将值类型隐式转换为Object类型,为装箱数值分配对象实例。例如:,int i=123;,object ob=i;/装箱,上述语句执行结果是在堆栈中创建对象ob,该对象引用了堆中的int类型,该数值是赋给变量i的数值备份。,2.拆箱,拆箱操作是显式的将object类型转换为值类型。下面语句演示了装箱和拆箱。,int i=123;,object ob=i;/装箱,int j=(int)ob;/拆箱,可以看出,拆箱是装箱的逆过程,要注意的是,装箱和拆箱需要遵守类型兼容的原则。,2.2 变量与常量,知道了C#有哪些数据类型以及如何将一种数据类型转换为另一种数据类型,我们还需要知道C#中有哪些常量和变量以及如何定义常量和变量。,2.2.1 变量,变量用来表示一个数值、一个字符串值或者一个类的对象。变量存储的值可能会发生更改,但变量名保持不变。,1.变量声明,C#中,变量必须先声明后使用。声明变量的语法为:,类型标识符 变量名;,或,类型标识符 变量名1,变量名2,变量名3.;,例如,下面语句声明了一些变量:,int num;/声明整型变量num,float sum;/声明浮点型变量sum,char ch;/声明字符型变量ch,2.变量命名规则,C#在变量声明时,变量名的命名应该遵守一些基本规则:,变量名长度不能超过255个字符。,变量名在有效的程序范围内是唯一的。,变量名不能是关键字(保留字),但可以嵌入使用关键字到变量名。,变量名用字母开头,不要使用数字开头。,关键字是一种高级程序设计语言中属于语言成分的特殊标识符,用户是不能使用这些标识符定义各种名称的。,2.2.2 变量的种类,C#定义了7种变量,即静态变量、实例变量、数组元素、值参数、引用参数、输出参数和局部变量。,2.2.3 常量,常量就是值在程序整个生命周期内始终不变的量,使用关键字const声明。在使用中,不可以对常量进行赋值。常量声明的语法为:,访问修饰符const类型标识符 常量名=值;,例如:,public const double PI=3.1415926;,const int dayinyear=365;,语法中方括号表示其中的内容是可选项,如果采用逻辑符号“|”表示“|”两端的内容是或者得关系。,2.3 运算符与表达式,运算符是指在表达式中执行哪些操作的符号。表达式则由常量、变量、对象以及各种运算符组成。,2.3.1 运算符分类,按照操作数分类,C#语言提供3大类运算符。,一元运算符:带一个操作数的运算符称为“一元”运算符,如i+。,二元运算符:带两个操作数的运算符称为“二元”运算符,如x+y。,三元运算符:带三个操作数的运算符称为“三元”运算符,C#中只有一个三元运算符,即条件运算符“?:”。,2.3.2 算术运算符,C#中算术运算符就是用于常规运算功能的符号,包括:加法运算符(+)、减法运算符(-)、乘法运算符(*)、除法运算符(/)、求余运算符(%)、自增运算符(+)、自减运算符(-)、,要注意的是乘法、除法运算符只适用于整数和实数之间的操作;默认运算返回值与精度高的类型相同。求余运算符用来求除法的余数。,2.3.3 赋值运算符,赋值运算符用于改变变量的值,即为变量赋值。C#中提供了一个简单赋值运算符“=”和多个复合赋值运算符包括:+=、-=、*=、/=、%=、=、&=、=和|=。,赋值运算符是左结合,将右边的操作数的值赋给左边的操作数,左操作数必须是变量。C#也可以对变量进行连续赋值,此时赋值运算是从右向左进行。,2.3.4 关系运算符,关系运算符用于在程序中比较两个值大小,关系运算的结果是布尔型。关系运算符包括:=、!=、=。,2.3.5 逻辑运算符,逻辑运算中,使用逻辑运算符将运算对象连接起来形成逻辑表达式,逻辑运算只有两个结果:true和false,表示真和假。,2.3.6 三目运算符?:,该运算符是根据布尔表达式的值返回两个值中的一个。如果条件为真,则返回第一个值;否则,返回第二个值。语法为:,(布尔表达式)?值1:值2,2.3.7 运算符优先级,当一个表达式包含多个运算符时,表达式的值就由各运算符的优先级决定。表2-7为运算符的优先级描述。,表2-7 运算符优先级(由高到低),特殊运算符,(),一元运算符,+(正)、-(负)、!(逻辑非),乘/除运算符,*、/、%,加/减运算符,+、-,移位运算符,关系运算符,、=、is,比较运算符,=、!=,逻辑与运算符,&,逻辑异或运算符,逻辑或运算符,|,条件与运算符,&,条件或运算符,|,三目运算符,?:,赋值运算符,=、+=、-=、*=、/=、%=,2.4 输入与输出,程序设计中,输入与输出是程序的必需功能。数据的输入与输出方式有控制台方式和文件方式两种。控制台是一个操作系统窗口,用户可通过键盘输入文本,并从显示器读取文本输出。C#语言的控制台I/O主要通过命名空间System中的Console类实现的。该类给出了标准的输入和输出方法。,1.控制台输入,控制台输入包含两个实现控制台输入的方法:Read()和ReadLine()。,Read()方法每次从标准输入流中读取一个字符(此时程序运行到Read()语句暂停,直到输入任意字符并按回车键才返回继续运行),程序将接收的字符作int型值返回给变量。如果输入流没有字符,则返回-1。Read()方法使用的语法格式为:,Console.Read();,ReadLine()方法用于从控制台一次读取一行字符串,直到遇到回车键才返回读取的字符串,但此字符串不包含回车键和换行符;如果接收无效字符串,则ReadLine()方法返回null。ReadLine()方法的语法格式为:,Console.ReadLine();,2.控制台输出,控制台输出输出包含两个方法:Write()和WriteLine()。它们都可以输出一个或多个值,区别在于Write()方法输出后没有换行符,而WriteLine()方法输出后有换行符。两个方法都有各种不同的重载,为输出多个不同类型数据提供支持。语法格式如下:,Console.Write(“格式字符串”,参数表);,或,Console.WriteLine(“格式字符串”,参数表);,小结,本章主要介绍了C#语言中的数据类型、变量与常量、以及运算符与表达式。其中,重点是掌握数据类型与变量,以及表达式的使用方法,为后续编写C#程序代码奠定基础。,主 编 鲁 立 张松慧,中国水利水电出版社,3.1 选择语句,C#语言提供了条件语句(即if语句)和多路分支语句(即switch语句)实现选择结构。,第3章 流程控制与函数,3.1.1 if语句,条件语句即if语句,if语句的基本功能是:判断给定的条件是否满足,从而选择执行给出的对应操作。if语句有三种基本形式:if、if-else、if-else-if。,1.双分支的if语句,提供两种选择。,格式:,if(表达式)语句1,else 语句2,功能:先计算表达式的值,根据表达式的值提供两种选择,当表达式值为真(即非0),选择执行语句1;否则,选择执行语句2。使用此形式的if语句就可以根据表达式的值在语句1和语句2中选择一个执行。,例如:,if(ab),Console.WriteLine(较大的是0,a);,else,Console.WriteLine(较大的是0,b);,此程序段的功能是选择输出两个变量a和b中较大的值。,说明:,(1)书写时表达式两侧的圆括号不可少。,(2)表达式通常是逻辑表达式或关系表达式,也可以是任意类型的表达式(如整型、实型、字符型等)。,(3)if 和else 是C#语言的关键字,且else 不是独立的语句,它是if语句的一部分。使用时else必须与if配对,共同组成一条if-else 语句。,(4)“语句1”称为if子句,“语句2”称为else子句,可以是单条语句,也可以是用“”括起来的复合语句,分别代表双分支选择结构的分支之一,不要把子语句理解为独立的语句。,2.单分支的if语句,如果只提供一种选择则构成了单分支的if语句。,格式:,if(表达式)语句,功能:先计算表达式的值,当表达式的值为真(即表达式的值非0),执行其后的语句;否则,无操作,顺序执行if语句后面的语句。,如:,if(a 0),a=-a;,Console.WriteLine(结果为:0,a);,3.多分支的if语句,如果提供多种选择,则可以采用if-else-if形式的语句(即多分支选择结构)。,格式:,if(表达式1)子语句1,else if(表达式2)子语句2,else if(表达式3)子语句3,else if(表达式n)子语句n,else 子语句n+1,功能:自上而下有序地判断条件表达式,一旦发现某个表达式的值为真,则执行该表达式后面的子语句,其余子语句不被执行。如果所有条件表达式的值均为假,执行最后一个else分支后的子语句n。,说明:,(1)最后一个else常作为缺省条件,即当前面的所有条件表达式测试都失败后,执行它后面的子语句n+1。,(2)无论有多少分支的if-else-if语句,它们都是一个if语句,在分析程序时尤其要注意这点,不要把一个语句理解为多个语句。,(3)语句中的else和if之间均有空格,不要写成elseif形式。,3.1.2 switch语句,switch语句,它的功能和if-else-if类似,switch语句可以根据表达式的不同取值,直接进行多分支选择处理,使程序的结构清晰明了,减少一些嵌套错误。,switch语句的格式为:,switch(表达式),case 常量表达式1:语句1;,case 常量表达式2:语句2;,case 常量表达式n:语句n;,default:语句 n+1;,功能:switch语句对表达式进行连续测试。先计算switch后表达式的值,然后将该值与各case后面的常量表达式的值进行比较。当其值与某一常量表达式的值相同时,就从该case后面的语句开始执行,直到switch语句结束时为止;若其值与所有的常量表达式的值都不相同,就执行default后面的语句,若不存在default,则不进行任何处理。,说明:,(1)switch后面的“表达式”可以为任何类型。,(2)switch语句与if语句不同,switch通过测试表达式的值与case常量表达式的值是否相等来进行分支的选择,而if语句是通过判断表达式的值是否为0(即真/假)来实现选择结构。,(3)同一个switch语句中,每一个case常量表达式的值必须各不相同。,(4)switch语句中表达式的类型必须与各case常量表达式的类型一致,否则无法进行匹配。,(5)各个case和default的出现次序不影响执行结果。,(6)switch语句中允许出现空的case语句,即多个case共用一组执行语句。,(7)switch语句通常和break语句联合使用。break语句也称为间断语句,可以在switch语句中的case语句之后加上break语句。break语句的作用是跳过后面的case部分,结束switch语句。因此如果没有break语句,程序在执行完相应的case语句后不会退出,而是继续执行下一个case语句,直到switch语句结束,而有了break语句后每当执行到break语句时,立即跳出switch语句体,从而起到真正的分支作用。,3.1.3 嵌套条件的if语句,在if语句中又包含一个或多个if语句称为if语句的嵌套。一般形式如下:,if(表达式1),if(表达式2)语句1,else 语句2,else,if(表达式3)语句3,else 语句4,说明:,(1)上面为嵌套的一般形式,其对应的N-S图为图4-5。注意,嵌套的if语句即可作为if的子语句,也可以作为else的子语句。,(2)通过嵌套,上面的语句共包含三个条件表达式,对应为具有四个分支的选择结构。,(3)此形式中包含外层的if语句和内层嵌套的if语句,嵌套也可以是两层以上。,(4)注意嵌套语句中if与else的配对关系。原则是:从最内层开始,else总是与它上面离它最近的尚未配对的if配对。,3.2 循环语句,循环语句可以重复执行一个程序模块,C#语言中的循环语句有while语句、do-while语句、for语句和foreach语句。其中foreach语句用于集合的循环操作。,循环语句每次在执行前需要判断循环条件是否成立,如果满足则重复执行循环体语句,直到条件语句不成立才退出。循环结构可以看成是一个条件判断语句和一个回转语句的组合。这样就不用多次书写同一代码。,3.2.1 while语句,while语句是一个条件循环语句,在条件为true的情况下,会重复执行循环体内的语句。直到条件为false为止。while语句一般用于循环次数不确定的场合,while语句语法如下:,while(条件表达式),循环体,循环体内的程序可能会执行多次,也可能一次也不执行。,说明:,(1)在整个循环过程中,需要有一个循环控制变量发生变化,使得循环趋向结束;如果没有修改该变量的值或没有这个趋势,有可能导致循环无法终止。,(2)在循环体中如果包含break语句,当程序执行到break语句时,就会结束循环;执行循环结构之后的语句。,3.2.2 do-while语句,do-while语句与while语句类似,区别在于:它首先执行循环体代码,然后判断循环条件是否满足,也就是说,do-while循环不论条件是否满足,都至少要执行一次循环体内容;while循环如果条件不满足,循环体将不会执行。do-while语句的语法格式为:,do,循环体,while(条件表达式),
展开阅读全文