《第2章C编程基础.ppt》由会员分享,可在线阅读,更多相关《第2章C编程基础.ppt(66页珍藏版)》请在三一办公上搜索。
1、第2章 C#编程基础,2.1 标识符和关键字,2.1.1 标识符标识符最多可以由511个字符组成,需要遵循下列命名规则:由字母、数字和下划线“_”组成。首字符必须是字母或下划线“_”。C#语言对字母大小写敏感。两个标识符即使是对应的字母大小写不同,也是完全不同的标识符。标识符不能与关键字同名。C#语言采用Unicode字符集,因此“字母”和“数字”的定义比常用的ASCII字符集(Unicode的一个子集)要广泛的多。,下面是合法的标识符:Abcabc123class,下面是不合法的标识符:abc!/含有特殊字符“!”7abc/非法的首字符abc 123/含有空格class/“class”是关键
2、字,2.1 标识符和关键字,2.1.2 关键字 C#语言保留77个标识符作为关键字(参见教材P25表3-2),每个关键字都有特定的含义和用途,用户不应重用这些标识符。,2.2 常量与变量,2.2.1 常量 在程序运行过程中值不发生改变的量称为常量。常量只能在声明时赋值。其声明常量的一般语法表达式为:访问修饰符 const 数据类型 常量名=表达式;例如:public const double pi=3.1415926;,2.2 常量与变量,2.2.2 变量的概念数据存储时将分配内存空间,该内存空间存储的量,表示为地址的量。可以改变已知地址的量,故该地址对应的的量叫做变量。在高级语言中为了方便起
3、见常用一个名称表示特定内存的地址,该名称即为变量名。变量的基本操作:赋值,C#表示为“=”x=1;y=2;z=x;表达式w=x+y+z;,5,2.2.3 数据类型C#是强类型语言,即每个变量都必须具有声明的数据类型。从用户的角度,数据类型可分为内置数据类型(如int、char等.NET Framework预定义好的类型)和用户自定义数据类型(如class、interface等,由用户声明创建)。从数据存储的角度,则可分为值类型和引用类型指针类型。值类型用于存储数据的值,包括简单值类型、结构类型和枚举类型;引用类型用于存储对实际数据的引用地址,包括类类型、接口类型、委托类型和字符串类型等。,2.
4、2 常量与变量,2.2 变量,2.2.4 定义一个值类型的变量:int i=12;/定义一个数据类型为整型的变量i并初始化为12int I;/定义一个数据类型为整型的变量II=2;,7,2.2 变量,2.2.5 定义一个引用类型的变量Student stu;/定义一个Student类型的引用stu=new Student();/实例化Student并将对象的地址赋给stu引用Student stu=new Student();以上两句是等价的,8,2.2 变量和常量,2.2.6 静态变量和实例变量 用static修饰符声明的变量称为静态变量。静态变量从属于包含它的类,一旦所从属的类被装载,直到
5、该类运行结束,静态变量将一直存在。静态变量的初始值是该变量的类型的默认值。未用static修饰符声明的变量称为实例变量。类的实例变量在创建该类的新实例时开始存在,在所有对该实例的引用都已终止,并且已执行了该实例的析构函数(若有)时终止。结构中的实例变量随着它所属的结构变量存在或结束。,2.3 值类型,2.3.1 简单值类型1.整型,下面的语句是正确的:int a;a=321;/先定义,再赋值long b=321;/先隐式转换,再赋值long c=0 x12aL;/十六进制表示int x1=10,x2,x3=30;/可以在一个语句中声明多个变量,下面的语句是错误的:uint x=-49;/无符号
6、整数不能为负byte x=300;/超出取值范围short y;Console.WriteLine(y);/变量在赋值前不能被使用,2.3 值类型,2.浮点型 浮点型包括单精度(float)和双精度(double)两种,分别采用32位单精度和64位双精度的IEEE 754格式表示。float型变量赋值时应在数值后加上类型指示符F,因为默认情况下赋值运算符右侧含数值被视为double型。下面的语句都是正确的:float x=2.4F;double y=4.5;,2.3 值类型,3.小数(decimal)型 小数(decimal)型是特殊的浮点型数据,它是128 位的数据类型。同浮点型相比,dec
7、imal 类型具有更高的精度和更小的范围,这使它适合于财务和货币计算(小数部分的舍入方法采用的是银行家舍入方式)。4.布尔(bool)型 布尔(bool)型用于声明变量来存储布尔值true和false,可将布尔值赋给bool变量,也可以将计算为bool类型的表达式赋给bool变量。bool型主要用于逻辑判断。bool型正确用法如下:bool i=true;bool a=(i0 在计算机内部实际上是用二进制1和0表示布尔值true和false。,2.3 值类型,5.字符(char)型字符(char)型用于声明16位的Unicode 字符。C#语言中字符型的变量可以使用字符、加十六进制的转义符前缀
8、(“x”)和Unicode表示形式来进行赋值。例如:char c1=B;/字符表示的字母“B”赋值给变量c1 char c2=x0042;/字符表示的字母“B”赋值给变量c2 char c3=u0042;/字符表示的字母“B”赋值给变量c3,2.3 值类型,2.2.2 结构类型(struct)结构类型是一种值类型,通常用来封装小型相关变量组。声明结构类型的语法表达式为:访问修饰符 struct 结构名称结构体;表示里面的内容为可选项。结构体中定义该结构的成员,结构类型的成员可以是数据成员、方法成员、另一个结构类型成员等。例如:struct student public string name;
9、public int ID;public int score;student是结构名称,花括号之间是结构体,name、ID、score都是这个结构的数据成员(此处可称为字段)。,2.3 值类型,2.3.3 枚举类型(enum)枚举类型是一种由一组称为枚举数列表的常数组成的独特类型。它的实质就是用标识符来表示一组相互关联的数据。每种枚举类型都有对应的数据类型,可以是除char以外的任何简单值类型。枚举类型是使用关键字enum定义的,声明枚举类型的一般语法表达式为:访问修饰符enum 枚举变量名称:数据类型枚举列表;,2.3 值类型,枚举列表中成员的默认类型为 int。默认情况下,第一个枚举数的值
10、为 0,后面每个枚举数的值依次递增 1。例如:enum Weekdays Sun,Mon,Tue,Wed,Thu,Fri,Sat;在这个枚举中Sun为0,Mon为1,Tue为2,依次类推。如果需要改变默认的值,则要在定义时改变设定值。例如:enum Weekdays:longSun=1,Mon,Tue,Wed,Thu=22,Fri,Sat;在这个枚举中枚举的成员类型是长整型long,Sun为1,Mon为2,Tue为3,Wed为4,Thu为22,Fri为23,Sat为24。枚举值的引用枚举变量名.枚举元素名如:Weekdays.Sun,2.4 引用类型,引用类型只存储对实际数据的引用地址。C#语
11、言的引用类型包括类、接口、委托、数组、字符串等。本节只介绍object类型、类类型、字符串类型和数组类型。,2.4 引用类型,2.4.1 object类型 object 类型在.NET Framework 中是Object(注意大小写)的别名。在 C#的类型系统中,所有类型(预定义类型、用户定义类型、其他引用类型和值类型)都是直接或间接从Object继承的。因此可以将任何类型的值赋给object类型的变量。object a;a=100;lblOutput1.Text=“a的值是”+a.Tostring();lblOutput2.Text=“此时值的类型是“+a.GetType().Tostri
12、ng();/GetType是Object类的一个方法用来获得当前实例的Type a=AA;lblOutput3.Text=“a的值是”+a.Tostring();lblOutput4.Text=“此时值的类型是“+a.GetType().Tostring();,2.4 引用类型,2.4.2 类类型 类是C#或面向对象程序设计中最重要的概念,本书将在第4章对类及其使用方法进行详细说明。类是能存储数据并执行操作的复杂数据结构,用来定义对象可执行的操作(方法、事件、属性等),类的实例是对象。类是使用关键字class定义的,声明类的语法表达式为:访问修饰符class 类名称:基类名以及实现的接口列表/
13、类成员定义 其中基类只能有一个,而接口可以有多个。一个类可包含的成员可以有:构造函数、析构函数、常数、字段、方法、属性、索引器、运算符、事件、委托、类以及结构等,可以说一切皆在类中。,2.4 引用类型,2.4.3 数组 数组(array)类型是由若干个数据类型相同的数组元素构成的数据结构。数组元素可以是C#语言中定义的任意数据类型,其中也包括数组类型本身。每个元素可以通过数组名称和索引(index)进行访问。同C/C+一样,C#语言中数组元素的索引也是从0开始。按照数组的维数,数组可分为一维数组和多维数组,多维数组又可分为矩形数组和交错数组。常用数组声明的语法表达式如下:,数组,1.一维数组一
14、维数组的声明:数据类型 数组名称;数据类型 数组名称=new 数据类型数组大小;数组的初始化:数据类型 数组名称=初始化数值序列;数据类型 数组名称=new 数据类型数组大小初始化数值序列;数据类型 数组名称=new 数据类型 初始化数值序列;对于第二种初始化方式,数值序列的个数不能大于数组大小如果数组元素是值类型,那么初始化的默认值为0(char型为u0000,bool型的为False);如果数组元素是引用类型,那么初始化的默认值为null(空)。,22,数组,一维数组的元素个数:使用Length属性可以得到数组元素的个数数组元素的引用数组名元素索引号(数组元素的索引号从0开始)Byte a
15、ge=;Byte ave=(age0+age1+.+age36)/37,23,数组,2.多维数组维数组的声明、创建以及初始化。与一维数组相似。例如:int,array1=new int3,2,4;/三维数组,有24个数组元素,初始化为0数组的维数、维数长度和数组的长度。数组维数长度指的是每一个维度的长度,例如array1的第1、2、3维的维数长度分别是3、2、4;数组长度就是24。多维数组初始化。需要仔细核对大括号的层数和位置。例如:/三维数组,维数长度分别是2,1,3 int,array2=new int,1,2,3,4,5,6;int,array3=1,2,3,4,5,6;/二维数组,维数
16、长度分别是3,2访问多维数组的元素。可以使用下面的表达式:数组名索引表达式1,索引表达式2,每个索引表达式的值必须在0到相应维数长度减1之间。例如:array20,0,2=3;而array21,0,1=5。,2.5 类型转换,类型转换形式:隐式转换与显式转换隐式转换是不需要交易声明就可以进行的转换,也叫自动转换。隐式转换一般是安全的,不会造成信息丢失及隐患。显式转换又称强制转换,转换需要用户明确指定转换的目标类型值类型间的转换引用类型间的转换值类型与引用类型(object)间的转换Convert类提供的静态方法进行转换。值类型隐式地转换为object类型的称为装箱,object类型显式地转换为
17、值类型称为拆箱。,2.5 类型转换,2.值类型间转换隐式转换 一般为简单值类型数据间的转换,而且须是从低精度、小范围的简单值数据类型到高精度、大范围的简单值类型的转换,包括以下几种情况:小范围的整数类型可以隐式地转换成大范围的整数类型。整数类型可以隐式地转换成浮点类型和小数类型。float类型可以隐式地转换成double类型。char类型可以隐式地转换成ushort、uint、int、ulong、long、float、double类型。下面给出隐式转换的示例:long a=10;/定义long整型 float b=a;/隐式地转换为单精度浮点型 int c=a;/错误,int类型的精度低于lo
18、ng类型的精度 char s=A;/定义字符型 a=s;/隐式地转换为int整型,a等于65,2.5 类型转换,2.值类型间转换显式转换 显式转换又称强制转换,不满足隐式转换条件的简单值类型之间只能进行显式转换。显式转换需要用户明确指定转换的目标类型,例如:double f=1234.56;int i=(double)f;/将f的值显式地转换为int类型,i等于1234 sbyte s=(sbyte)f;/将f的值显式地转换为sbyte类型,s等于-46 枚举类型在本质上也是整数,但枚举类型和简单值类型之间只能进行显式转换,只有常数0例外,0可以直接赋值给枚举类型的变量。例如:enum Wee
19、kdays Sun,Mon,Tue,Wed,Thu,Fri,Sat;Weekdays w=(Weekdays)4;/显式转换后,w的值为Thu Weekdays w1=(Weekdays)10;因为w1被赋予的值超出了枚举定义的范围,w1的值就是10,但其数据类型仍然是枚举类型。需要强调的是,显式转换包含所有隐式转换,但显式转换可能会失败,有可能出现编译错误,但有时编译器也发现不了,而且转换过程会出现信息丢失。,2.5 类型转换,3.引用类型之间的转换 引用类型之间也可以进行转换,其基本原则是:如果引用类型B是从引用类型A继承的,那么B可以隐式转换到A;反之,只能进行显式转换,且不一定成功。例
20、如:class A public int i;class B:ClassA public int j;/类B继承自类A class Test B myclass1=new B();/派生类B的对象可以隐式地转换成基础类A的对象 A myclass2=myclass1;/基础类A的对象显式地转换成派生类的对象 B myclass3=(B)myclass2;Console.WriteLine(0,myclass2.i);/正确 Console.WriteLine(0,myclass2.j);/编译错误 Console.WriteLine(0,myclass3.i);/正确,2.5 类型转换,值类型
21、与Object间的转换 装箱与取消装箱值类型到Object转换可以采用隐式转换,叫做装箱,反之叫做取消装箱。如:int x=100;object y=x;/装箱 x=(int)y;/取消装箱,2.5 类型转换,5.Convert类的方法 Convert类中提供了相当多的方法,可以将一个基本数据类型转换成另一个基本数据类型,其支持的基本数据类型有Boolean、Char、Int16、Int32、Int64、UInt16、UInt32、UInt64、SByte、Byte、Single、Double、Decimal、DateTime、String。这些方法的名称通常以“To”开头,例如:int a=
22、10;string s1;s1=Convert.ToString(a);。,2.6 表达式和运算符,2.6.1 表达式 表达式是由操作数和运算符构成的,是变量、常量、方法调用命名空间引用和运算符等的组合。它不仅仅指数学运算中的表达式,它包括方法调用、命名空间引用、函数成员引用等表示方式。简单的表达式可以是一个常量、变量、方法调用或列表。表达式可以使用运算符,还可以用运算符将多个简单表达式连接起来组成复杂表达式。例如:int a=3;int b=7;int c=a+b;string s=TextBox1.Text+你好;字符串s的值是控件TextBox1的成员Text用连接符“+”与字符串“你好
23、”连接而得的。,2.6 表达式和运算符,2.6.2 运算符 运算符按功能可分为:算术运算符、关系运算符、逻辑运算符和赋值运算符。按操作数的个数可分为:一元运算符、二元运算符和三元运算符。一元运算符带有一个操作数,使用前缀表示法(如 x)或后缀表示法(如 x+)。二元运算符带有两个操作数,全都使用中缀表示法(如 x+y)。三元运算符带有三个操作数。C#语言中只有一个三元运算符“?:”,它使用中缀表示法(如C?x:y)。,2.6 表达式和运算符,1.算术运算符 C#语言中算术运算符有加(+)、减(-)、乘(*)、除(/)和取模(%),用于完成基本的算术运算。这5个算术运算符都是从左向右执行,且后3
24、个运算符的优先级高于前2个运算符。,2.6 表达式和运算符,2.赋值运算符 前面示例已经大量使用过简单赋值运算符“=”,它的一般语法形式是:变量=表达式;右边的表达式是任何常量、变量或可以计算产生值的表达式,左边必须是变量。它表示将右边的操作数的值赋予左边的操作数,但是有个前提,就是右边表达式值的数据类型和左边变量的数据类型相同,或能够隐式地转换为左边变量的数据类型。C#语言还有10个复合赋值运算符,用于简化程序代码,它们是:+=、-=、*=、/=、%=、=、/先计算y+=10,再计算 x*=y,最后 z=x执行完上面两条语句后,y的值为19,x和z的值都为152。,2.6 表达式和运算符,3
25、.关系运算符 关系运算符有6个:(大于)、=(大于或等于)、=(等于)、!=(不等于)。=和!=运算符的操作数可以是值类型和引用类型,而其他4种关系运算符的操作数只能是值类型。int x=10,y=15;Console.WriteLine(x=y);/输出false Console.WriteLine(x!=y);/输出true object z=x;object w=y;Console.WriteLine(w!=z);/输出true,因为w和z分别指向两个不同的对象 C#语言不支持连续的关系比较,例如:bool w=(x y z),是错误的。C#语言中还有一种特殊的关系运算符“is”,主要用
26、于判断两边的操作数是否有相同的数据类型。,2.6 表达式和运算符,4.逻辑运算符 C#语言的逻辑运算符有6个,分别是:!(逻辑非)、第二条语句计算bool变量a时,首先计算x y的值,结果为true,则不论|(条件或)右边表达式的值为true还是false,其结果都是true。因此|(条件或)右边的表达式不再执行,结果是:a=true,y=15,z=13。第三条语句的结果是:b=true,z=13。,2.6 表达式和运算符,5.位运算符 C#语言的位运算符有6个,分别是:(按位求反)、x的二进制为“00001010”,z为“1111 1111 1111 1111 1111 1111 1000
27、0001”,y的值为80,二进制形式为“01010000”,w的值为-32,二进制形式为“1111 1111 1111 1111 1111 1111 1110 0000”。提示:整数是用二进制补码表示的,int类型是有符号32位整数。,2.6 表达式和运算符,6.条件运算符 条件运算符“?:”是唯一一个三元运算符,它的完整表达式形式如下:表达式1?表达式2:表达式3其中表达式1的值必须为bool类型。若表达式1的值为true,则计算表达式2的值,并将该值作为完整表达式的值;若表达式1的值为false,则计算表达式3的值,并将该值作为完整表达式的值。完整表达式的类型位表达式2和表达式3中类型取值
28、范围大的类型。例如:Console.WriteLine(“0”,(75)?4:5.5);其输出为:4,39,3.7 使用系统类,40,System.Convert类,41,示例,num1=98 strGrade=“您的成绩是”&Convert.ToString(num1)&“分”thedate=Convert.ToDateTime(12/09/2004),42,System.String类,静态方法Compare(字符串1,字符串2,是false/否true区分大小写)结果0、负、正将数组元素以指定的分隔符连成一个字符串:Join(“-”,数组)属性Length方法去除字符串前后、前面、后面空
29、格或在char数组出现的字符Trim(char数组)、TrimStart(char数组)、TrimEnd(char数组)ToCharArray()将字符串分解为char数组取子字符串:Substring(开始位置,长度)转换成大写或小写:ToLower()、ToUpper()与指定的字符串比较,相等为0,小于为负,大于为正CompareTo(字符串)返回指定字符串在当前字符串I第一次或最后一次出现的位置IndexOf(字符串)、LastIndexOf(字符串)返回当前字符串是否以指定的字符串开头或结尾StartsWith(字符串)、EndsWith(字符串)根据给定的分隔符将字符串拆分为一个一
30、维数组:Split(分隔符)Replace(被替换子字符串,替换成的子字符串),43,System.String类操作示例(1),静态方法的使用 Int Result=String.Compare(VB.NET,VB.NET)String strA=VB.NET,ASP.NET,C#Int Result=String.Join(*,strA),44,System.String类操作示例(2),一般方法和属性使用 String strA=new String(VB.NET“);Result=strA.Length;Result=strA.Trim();Result=A.ToUpper();Res
31、ult=This a good book.Substring(8,4);Result=.IndexOf();Result=abcdb.StartWith(ab);Result=abcdb.Replace(ab,*);Char chrA=*,#,Result=#*asp.TrimStart(chrA)String ResultResult=VB.NET s good!.Split(),45,System.DateTime类,创建对象:using System;DateTime d=new DateTime(2009,2,26,10,25,36);静态属性:当前日期和时间 Now、当前日期Toda
32、y静态方法:Comapre(DataTime1,DataTime2)返回0、正或负一般属性Year、Month、Day、Hour、Minute、Second、DayOfWeek、DayOfYear、Date、TimeOfDay一般方法AddYears(整数)、AddMonths(整数)、AddDays(整数)、AddHours(整数)、AddMinutes(整数)、AddSeconds(整数)ToLongDateString()、ToShortDateString()、ToLongTimeString()、ToShortDateString()返回给定时间减去参数中的DateTime的天时分秒
33、SubTract(DateTime),46,日期和时间操作示例(1),静态成员的使用Result=您来访的日期&DateTime.Today Result=您来访的时间&DateTime.Now Result=DateTime.Compare(date1,date2),47,日期和时间操作示例(2),实例成员的使用using System;DateTime d=new DateTime(2008,1,1);Result=DateTime.Today.Month Result=d.DayOfYear Result=DateTime.Now.TimeOfDay Result=d.AddDays(-
34、600)Result=d.ToLongDateString()Dim Result As TimeSpan Result=d.Subtact(DateTime.Today),48,System.Math类,静态方法;Abs(number)、Sin(number)、Cos(number)、Tan(number)、Atan(number)平方根Sqrt(number)、幂函数Pow(number1,number2)自然指数Exp(number)、Log(number)、Log10(number)四舍五入Round(number)大于等于number的最小整数:Ceiling(number)小于等于
35、number的最大整数:Floor(number)Max(number1,number2)、Min(number1,number2)静态字段PI、E,49,数学操作示例,Result=Math.PI*22 Result=Math.Round(10.6)Result=Math.Max(3,6),50,使用ToString(“格式化参数”)方法格式化数字,51,使用ToString(“格式化参数”)方法格式化数字,3.8 流程控制语句,3.8.1 条件语句 条件语句也称为选择语句,根据条件是否成立而控制执行不同的程序段。1.if 语句if语句的一般语法形式如下:,单独使用if语句,不加else语句
36、if(布尔表达式)/布尔表达式为真时执行的语句.,if语句和else语句配套使用if(布尔表达式)/布尔表达式为真时执行的语句.else/布尔表达式为假时执行的语句.,3.8 流程控制语句,在else语句中嵌套if语句,用于构建多分支结构的程序if(布尔表达式1)/布尔表达式1为真时执行的语句.else if(布尔表达式2)/布尔表达式2为真时执行的语句.else if(布尔表达式3)/布尔表达式3为真时执行的语句.else/所有条件均为假时执行的语句.,3.8 流程控制语句,2.switch语句switch语句的一般语法形式如下:switch(表达式)case 值1:语句序列1;case 值
37、2:语句序列2;default:值n switch语句中的表达式不能是关系表达式或逻辑表达式。每个语句序列可以使用花括号括起来,也可以不使用。但是每个语句序列中的最后一条语句必须是break语句、goto语句(尽量不要使用goto语句)或return语句。如果switch后的条件表达式和某个case后的值相等,则程序转到该case后的语句序列执行;如果switch后的表达式和所有case后的常量的值都不相等,则程序转到default后的语句序列执行;如果没有default标记,则跳出switch语句执行后面的语句。,3.8 流程控制语句,3.8.2 循环语句C#语言提供了多种循环语句,包括fo
38、r语句、while语句、do-while语句和foreach语句。1.for语句for语句的一般语法形式如下:for(初始表达式;循环条件表达式;循环控制表达式)/循环体语句序列.初始表达式是为循环控制变量赋初值,循环条件表达式是bool型表达式,循环控制表达式用于更新循环控制变量的值。,for语句的执行过程如下:(1)首先计算初始表达式,为循环控制变量赋初值。(2)然后计算循环条件表达式的值,判定是否满足循环条件,如果值为true,则满足条件,执行循环体语句序列一次;如果值为false,则不满足条件,退出循环。(3)执行语句序列执行完毕后,计算循环控制表达式,更新循环控制变量的值,然后再重复
39、第2步的操作。,3.8 流程控制语句,C#语言允许for语句中省略3个表达式,但分号不可以省略,且语句序列中有起终止循环的语句。例如:for(;)if(表达式=false)break;/其他语句序列.下面用for语句求1100的累加和:int sum=0;for(int i=1;i=100;i+)sum+=i;,3.8 流程控制语句,2.while语句while语句的一般语法形式如下:while(循环条件表达式)/循环体语句序列.其中循环条件表达式是bool型表达式,当循环条件表达式的值为true时,反复执行循环体语句序列;当表达式的值为false时,执行while语句块后面的语句。下面用wh
40、ile语句求1100的累加和:int i=1,sum=0;while(i=100)sum+=i;i+;,3.8 流程控制语句,3.do-while语句do-while语句的一般语法形式如下:do/循环体语句序列.while(循环条件表达式);do-while语句首先执行一次循环体语句序列,再计算表达式的值,如果值为true,则再次执行循环体语句序列,否则退出循环,执行后面的语句。int i=1,sum=0;dosum+=i;i+;while(i=100);,3.8 流程控制语句,4.foreach语句foreach语句的一般语法形式如下:foreach(类型 循环变量 in 表达式)/循环体语
41、句序列.其中表达式为可枚举的集合,指支持System.Collections.IEnumerable接口的一个集合,如数组、ArrayList类、字符串等。循环过程中,表达式的数组或集合中的元素会被依次赋值给循环变量,并执行循环体语句序列。foreach语句用于循环访问集合中的元素,但不能更改集合的元素,循环变量时一个只读变量,且只作用于foreach循环体内,例如:int x=2,4,6,8,10;foreach(int i in x)i+;/错误,x中元素被指派给i,更改i会引发编译错误,3.8 流程控制语句,3.8.3 跳转语句1.break语句 在任何一种循环结构中,使用break语句
42、可以使程序执行流程跳出当前循环,并执行该循环后面的语句。对于多重循环,break语句只能使程序执行流程跳出其所在的那一重循环。bool flagfor(int i=2;i 30;i+)flag=true;for(int j=2;j=i/2;j+)if(i%j=0)flag=false;break;if(flag)Console.Write(0t,i);,3.8 流程控制语句,2.goto语句 goto语句使程序执行流程无条件地跳转到相应的由标识符标记的的语句处。它的一般语法形式如下:goto 标签;/待执行的语句.标签:语句;goto语句只能在一个方法体中进行语句跳转,且同一个方法体中标签名是
43、唯一的。在C#语言中,goto语言一般用在switch语句中,从一个case跳转到另一个case的情况下。由于goto语句的使用会破坏程序的可读性,编程时,尽量不要使用它。,3.8 流程控制语句,3.continue语句 continue语句只能在循环语句的循环体语句序列中使用,与break语句不同的是,continue语句不是终止并跳出当前循环,而是终止执行continue语句后面的语句,直接回到当前循环的起始处,开始下一次循环操作。下面用continue语句求1100的累加和(不含4及其倍数):int i=0,sum=0;do i+;if(i%4=0)continue;sum+=i;whi
44、le(i=100);,3.8 流程控制语句,4.return语句 return语句用于终止方法的执行,并返回到调用该方法的语句。它的一般语法形式如下:return 表达式;表达式是可选项,如果被调用的方法的类型不是viod,则return语句必须使用表达式返回一个同类型的值。如果方法的类型是void,可以省略return语句。如果return语句被放在循环体语句序列中,当满足条件时,执行return语句会结束循环(不论是单循环还是多重循环),且终止所在的方法调用。,3.9 异常处理语句,程序运行时可能会出现错误情况或其他不可预期的意外,例如用户输入错误、内存不足、资源不可用等。一个较完善的程序
45、应该尽可能的考虑到可能出现的各种异常,采用异常处理结构解决一部分错误,这对于提高程序的可靠性有非常重要的作用。1.try-catch语句try-catch语句提供了捕获和处理指定异常的方法,它的一般语法形式如下:try/语句序列.catch(类型 异常变量)/异常处理.程序正常运行时,执行的是try块的语句序列。如果try后的任何语句发生异常,程序都会转移到catch块的语句来处理异常。,3.9 异常处理语句,在下面的示例中输入的x的值要求是数值,如果错误的输入字符,则系统会提示:“未处理的异常:System.FormatException:输入字符串的格式不正确”。我们可以使用try-cat
46、ch语句来处理这种异常。【示例代码:chpt3-9 MyTryCatch】设计步骤如下:(1)在Visual Studio 2005中新建一个C#控制台应用程序。在新建项目对话框中的“名称”文本框中输入“MyTryCatch”,确定后,生成一个名为MyTryCatch的项目。代码编辑器中显示的是控制台应用程序的源代码文件Program.cs的内容。(2)编写如下所示的代码。namespace MyTryCatch class Program static void Main(string args),3.9 异常处理语句,Console.Title=chpt3-9;Console.WriteLine(请输入x的值:);while(true)try string s=Console.ReadLine();double x=Convert.ToDouble(s);int y;if(x 0)y=-1;else if(x=0)y=0;else y=1;Console.WriteLine(y的值为:0,y);,