《第2章VisualC语法基础.ppt》由会员分享,可在线阅读,更多相关《第2章VisualC语法基础.ppt(120页珍藏版)》请在三一办公上搜索。
1、第2章 Visual C#.NET 语法基础,内容简介,设计C#程序的主要目的是完成数据的运算与管理,C#支持丰富的数据类型、运算符以及控制流程的语句,是实现这一目的的基础保证。在编写C#程序时,不同类型的数据都必须遵循“先定义,后使用”的原则。本章主要介绍C#程序的基本结构以及基本数据类型、常量、变量、运算符和表达式等基础知识。,目录,2.1 C#程序结构,2.2 基本数据类型,2.6 值类型,2.7 本章小结,2.3 变量与常量,2.5 引用类型,2.4 运算符与表达式,2.1 C#程序结构,2.1.1 程序的组成要素 C#程序支持控制台应用程序、Windows应用程序和Web应用程序,其
2、中控制台应用程序是字符界面的,其余两类应用程序是图形界面。这三种应用程序的操作模式基本相同,也具有相同或相近的组成要素。,2.1.1 程序的组成要素,1标识符 2关键字3语句 4注释5命名空间 6类的定义和类的成员7C#程序中的方法,2.1.1 程序的组成要素,1标识符 与Java中定义及命名规则相同,区分大小写。关键字不可以用作普通标识符,但可以用前缀来避免这种冲突。(这是Java中不具有的特性)例如:int bool=3;Console.WriteLine(bool);System.Threading.Thread.Sleep(1000);C#中标识符的命名约定类名约定首字母大写变量名、方
3、法名等则约定使用Camel命名法。,2.1.1 程序的组成要素,2关键字关键字(keyword)是C#程序语言保留作为专用的有特定意义的字符串,不能作为通常的标识符来使用。在C#语言中主要有如下关键字:abstract、as、base、bool、break、byte、case、catch、char、checked、class、const、continue、decimal、default delegate、do、double、else、enum、event、explicit、extern、false、finally、fixed、float、for、foreach、get、goto、if、impl
4、icit、in、int、interface、internal、is、lock、long、namespace、new、null、object、operator、out、override、params、private、protected、public、readonly、ref、return、sbyte、sealed、set、short、sizeof、stackalloc、static、string、struct、switch、this、throw、true、try、typeof、uint、ulong、unchecked、unsafe、using、value、virtual、volatile、whi
5、le。,2.1.1 程序的组成要素,3语句 语句是应用程序中执行操作的一条命令。C#代码由一系列语句组成,每条语句都必须以分号结束。可以在一行中书写多条语句,也可以将一条语句书写在多行上。使用“”来表示应用程序中的不同层次和代码块。提示:为了表示代码的结构层次,要注意语句的缩进。虽然缩进在程序格式中不是必须的,但缩进可以清晰地显示出程序的结构层次,这是一种良好的编程习惯。,2.1.1 程序的组成要素,4注释(1)行注释:使用行注释标识符“/”,表示该标识符后的“一行”为注释部分。(2)块注释:块注释分别以“/*”和“*/”为开始和结束标识符,在此中间的内容,均为注释的部分。(3)文档注释:在C
6、#中,还可以用“/”符号来开头。在一般情况下,编译器也会忽略它们,但可以通过配置相关工具,在编译项目时,提取注释后面的文本,创建一个特殊格式的文本文件,该文件可用于创建文档说明书。例如:,2.1.1 程序的组成要素,namespace ConsoleApplication1 class Program/这是一个控制台程序/没有返回值 static void Main(string args)System.Console.WriteLine(参数1:+args0);System.Console.ReadLine();,2.1.1 程序的组成要素,5命名空间 命名空间有两种:系统命名空间和用户自定
7、义命名空间。系统命名空间是一个逻辑的命名系统,用来组织庞大的系统类资源,让开发者使用起来结构清晰、层次分明、使用简单。同时,用户也可以使用自定义的命名空间以解决应用程序中可能出现的名称冲突。,2.1.1 程序的组成要素,5命名空间(1)定义命名空间。在C#中定义命名空间的语法格式如下:namespace SpaceName 上述格式中,namespace为声明命名空间的关键字,SpaceName为命名空间的名称。在花括号中间的内容都属于名称为SpaceName的命名空间的范围,其中可以包含类、结构、枚举、委托和接口等可在程序中使用的类型。,2.1.1 程序的组成要素,(2)嵌套命名空间。命名空
8、间内包含的可以是类、结构、枚举、委托和接口,同时也可以在命名空间中包含其他命名空间,从而构成树状层次结构。例如:namespace Wrox namespace ProCSharp namespace Basics class ClassExample/Code for the class here.每个类名的全称都由它所在命名空间的名称与类名组成,这些名称用“”隔开,首先是最外层的命名空间,最后是它自己的短名。,2.1.1 程序的组成要素,(3)using语句。当出现多层命名空间嵌套时,键入起来很繁琐,为此,要在文件的顶部列出类所在的命名空间,前面加上using关键字。在文件的其他地方,就可
9、以使用其类型名称来引用命名空间中的类型了。例如:using System;using Wrox.ProCSharp;所有的C#源代码都以语句“using System;”开头,因为Microsoft提供的许多有用的类都包含在System命名空间中。,2.1.1 程序的组成要素,6类的定义和类的成员每一个C#应用程序都必须借助于.NET Framework类库实现,因此必须使用using关键字把.NET Framework类库相应的命名空间引入到应用程序的项目中来。C#的源代码必须存放到类中,一个C#应用程序至少要包括一个自定义类。自定义类使用关键字class声明,其名字是一个标识符。类的成员包
10、括属性、方法和事件,主要由方法构成。例如控制台应用程序或Windows应用程序必须包含Main方法,Main方法是应用程序的入口。程序的运行时,从Main方法的第一条语句开始执行,直到执行完最后一条语句为止。,2.1.1 程序的组成要素,7C#程序中的方法C#应用程序中的方法一般包括方法头部和方法体。方法头部主要包括返回值类型、方法名、形式参数(简称“形参”)类型及名称,若方法中包含多个形参,形参之间用逗号分隔。方法体使用一对“”括起来,通常包括声明部分和执行部分。声明部分用于定义变量,执行部分可以包含赋值运算、算法运算、方法调用等语句或语句块。,2.1.2 语法格式中的符号约定,表2-1列出
11、了Visual C#.NET参考的语法格式中常用的符号约定。,2.2 基本数据类型,C#中的数据类型,值类型,引用类型,指针类型(仅用于安全代码中),整数类型,浮点类型,字符类型,Decimal类型,布尔类型,类,接口,委托,数组,简单类型,枚举类型,结构类型,2.2 基本数据类型,值类型 值类型的数据存储在内存的堆栈中,可以提供快速访问。如果变量是值类型的,这个变量包含实际数据,在一个独立的内存区域保存自己的值;如果在代码中修改其值,在内存中会保存修改后的值。当值类型在方法体内被声明时,它们都是被放置到栈上的。值类型有时也会被放置到堆上,记住这条规则值类型总是放在它们被声明的地方。如果一个值
12、类型数据在方法体外被声明,且存在于一个引用类型中,那么它将被 堆总的引用类型所取代。引用类型 引用类型指向存储在内存堆中的数据的指针或引用。与纯粹的地址不同,引用总是指向一个对象,而且这个对象具有指定的类型,并且在堆上分配了存储空间。,2.2 基本数据类型,2.2.1 数值类型2.2.2 字符类型2.2.3 布尔类型和对象类型,2.2 基本数据类型,2.2.1 数值类型 数值类型可以分为整数类型和实数类型。1整数类型C#中支持8种整数类型:sbyte、byte、short、ushort、int、uint、long、ulong。这8种类型通过其占用存储空间的大小以及是否有符号来存储不同极值范围的
13、数据,根据实际应用的需要,选择不同的整数类型。整数类型的相关说明如表2-2所示。,2.2.1 数值类型,2实数类型实数类型包括浮点型和小数型(decimal),浮点型又包括单精度浮点型(float)和双精度浮点型(double)。浮点型数据一般用于表示一个有确定值的小数。计算机对浮点数的运算速度大大低于对整数的运算速度,数据的精度越高,对计算机的资源要求越高。因此,在精度要求不是很高的情况下,尽量使用单精度类型(占用4个字节)。如果精度要求较高的情况,则可以使用双精度类型(占用8个字节)。因为使用浮点型表示小数的最高精度只能够达到16位,为了满足高精度的财务和金融计算领域的需要,C#提供了小数
14、型(占用12个字节)。实数类型数据的相关说明如表2-3所示。,2.2.2 字符类型,字符类型包括字符型(char)和字符串型(string)。字符包括数字字符、英文字母、表达式符号等,C#提供的字符类型按照国际上公认的标准,采用Unicode字符集。字符型是指单个字符,一个Unicode的标准字符长度为16位,占用2个字节。char是类System.Char的别名。字符串型是指多个字符,其占用字节根据字符数量而定(允许不包含字符的空字符串)。string是类System.String的别名。,2.3 变量与常量,在程序处理数据的过程中,常量和变量用来标识数据。2.3.1 变量 2.3.2 常量
15、 2.3.3 类型转换,2.3.1 变量,在程序运行过程中,其值可以改变的量称为变量。变量可以用来保存从外部或内部接收的数据,也可以保存在处理过程中产生的中间结果或最终结果。在C#中,每一个变量都必须具有变量名、存储空间和取值等属性。1变量的声明 要使用变量,就必须声明它们,即给变量指定一个名称和一种类型。变量命名应遵循标识符的命名规则,如:必须以字母、下划线等Unicode字符开头,不能以数字开头,不能包含空格。声明了变量后,编译器才会申请一定大小的存储空间,用来存放变量的值。,2.3.1 变量,1变量的声明 一个语句可以定义多个相同类型的变量,变量间用逗号分隔,标识符和变量类型之间至少要有
16、一个空格。定义变量的语句以分号结束,例如:int a,b,c;float m,n;char ch1,ch2;下面给出一些非法的变量名的例子:int 3a;/不合法,以数字开头float namespace;/不合法,与关键字名称相同,2.3.1 变量,2变量的赋值 在C#中,变量必须赋值后才能引用。为变量赋值,一般使用等号“=”。例如:char ch1,ch2;ch1=O;ch2=K;int a,b,c;a=b=c=0;,2.3.1 变量,3变量的初始化 变量的初始化就是在定义变量的同时给变量赋初值,其一般形式为:数据类型 变量名1=初值1,变量名2=初值2,.;例如:float f11.25
17、,f23.6,f3;【例2-1】变量的定义和使用。,2.3.2 常量,在程序运行过程中,其值保持不变的量称为常量。常量类似于数学中的常数。常量可分为直接常量和符号常量两种形式。1直接常量所谓直接常量,就是在程序中直接给出的数据值。在C#中,直接常量包括整型常量、浮点型常量、小数型常量、字符型常量、字符串常量和布尔型常量。,2.3.2 常量,1直接常量(1)整型常量。整型常量分为有符号整型常量、无符号整型常量和长整型常量,有符号整型常量写法与数学中的常数相同,直接书写,无符号整型常量在书写时添加u或U标志,长整型常量在书写时添加l或L标记。例如,3、3U、3L。(2)浮点型常量。浮点型常量分为单
18、精度浮点型常量和双精度浮点型常量。单精度浮点型常量在书写时添加f或F标记,双精度浮点型常量添加d或D标记。例如,7f、7d。需要注意的是,以小数形式直接书写而未加标记时,系统将自动解释成双精度浮点型常量。例如,9.0即为双精度浮点型常量。,2.3.2 常量,(3)小数型常量。在C#中,小数型常量的后面必须添加m或M标记,否则就会被解释成标准的浮点型数据。C#中的小数和数学中的小数是有区别的。例如,5.0M。(4)字符型常量。字符型常量是一个标准的Unicode字符,使用两个单引号来标记。例如,5、d、昱、#都是标准的字符型常量。C#还允许使用一种特殊形式的字符型常量,即以反斜杠“”开头,后面跟
19、字符的字符序列,这种字符型常量被称为转义字符常量。该形式的常量可以表示控制字符或不可见字符,当然也可以表示可见字符。例如,n表示换行符,而x41则表示字符A。C#中常用的转义字符如表2-4所示。,2.3.2 常量,(5)字符串常量。字符串常量表示若干个Unicode字符组成的字符序列,使用两个双引号来标记。例如,“5”、“abc”、“清华大学”都是字符串。(6)布尔型常量。布尔型常量只有两个:一个是true,表示逻辑真;另一个是false,表示逻辑假。,2.3.2 常量,2符号常量符号常量使用const关键字定义,格式为:const 类型名称 常量名=常量表达式;“常量表达式”不能包含变量、函
20、数等值会发生变化的内容,可以包含其他已定义常量。如果在程序中非常频繁地使用某一常量,可以将其定义为符号常量,例如:const double PI=3.14159;【例2-2】不同类型的常量格式测试。,2.3.3 类型转换,在程序处理数据的过程中,经常需要将一种数据类型转化为另一种数据类型。数据类型的转换方式有两种:隐式转换和显式转换。1隐式转换隐式转换一般发生在数据进行混合运算的情况下,是由编译系统自动进行的,不需要加以声明。在该过程中,编译器无需对转换进行详细检查就能够安全地执行转换。隐式转换一般不会失败、不会出现致命隐患或造成信息丢失。例如:short s=1;int i=s;需要注意的是
21、,隐式转换无法完成由精度高的数据类型向精度低的类型转换。例如:int i=1;short s=i;/错误,如果必须进行转换,就应该使用显式类型转换,2.3.3 类型转换,1隐式转换隐式转换需要遵循如下规则:(1)参加运算的数据类型不一致,先转换成同一类型,再进行计算。不同类型数据进行转换时,按照数据长度增加的方向进行,以保证数据精度不降低。例如,int 型数据与long型进行运算,则先把int 型数据转换成long型再计算。(2)所有浮点型数据都是以双精度型进行的,例如,表达式5*3.5f*2.8d的3项先全部转换成双精度再进行运算。(3)byte和short型数据参与运算时,必须先转换成in
22、t 型数据。(4)char类型可以隐式转换成ushort、int、uint、long、float、double或decimal类型,但其他类型不能隐式转换成char类型。,2.3.3 类型转换,2显式转换 显式类型转换,又称为强制类型转换,该方式需要用户明确的指定转换的目标类型,该类型转换的一般形式为:(类型说明符)(需要转换的表达式)例如:short s=7;int i=(int)s;/将s的值显式转化为int类型,并赋值于int类型变量i 显式转换包含所有的隐式类型转换,即把任何编译器允许的隐式类型转换写成显式转换都是合法的。显式类型转换并不一定总是成功,且转换过程中会出现数据丢失。,2.
23、3.3 类型转换,2显式转换需要注意的是,使用显式转换时,如果要转换的数据不是单个变量,需要加圆括号。在转换过程中,仅仅是为本次运算的需要对变量的长度进行临时性转换,而不是改变变量定义的类型。例如:float a=3.5f;int i=(int)(a+5.1);/把表达式a+5.1的结果转换为int型,但 a的类型为float,值仍然是3.5f,2.3.3 类型转换,3.使用方法进行数据类型的转换(1)Parse方法 Parse方法可以将特定格式的字符串转换为数值,其使用格式为:数值类型名称.Parse(字符串型表达式)例如:int i=int.Parse(100);/字符串符合整型格式,转换
24、成功int j=int.Parse(“100.0”);/字符串不符合符合整型格式,出错(2)Convert类的方法(3)ToString方法,2.3.3 类型转换,3.使用方法进行数据类型的转换(1)Parse方法(2)Convert类的方法 Convert类提供了常用的方法将数字字符串转化为相应的数值,如ToBoolean、ToByte、ToChar、ToInt32、ToSingle等方法;Convert类还提供了ToString方法将其他数据类型转换为字符串,提供了ToChar方法将整型的ASCII码值转换为对应字符。例如:string s=97;int n=Convert.ToInt32
25、(s);/n=97 char c=Convert.ToChar(n);/ASCII码为97的字符是a,c=a,2.3.3 类型转换,3.使用方法进行数据类型的转换(1)Parse方法(2)Convert类的方法(3)ToString方法 ToString方法可将其他数据类型的变量值转换为字符串类型,其使用格式为:变量名称.ToString()其中,“变量名称”也可以是某个方法的调用。例如:int n=97;string s=n.ToString();/s=“97”string t=Convert.ToChar(n).ToString();/t=“a”【例2-3】数值字符串与数值之间的转换。,2
26、.4 运算符与表达式,2.4.1 运算符与表达式类型 运算符用于对操作数进行特定的运算,而表达式则是运算符和相应的操作数按照一定的规则连接而成的式子。常见的运算符有算术运算符、字符串运算符、关系运算符和逻辑运算符等,相应的,表达式也可分为算术表达式、字符串表达式、关系表达式和逻辑表达式等。,2.4.1 运算符与表达式类型,1算术运算符和算术表达式算术运算符有一元运算符与二元运算符。一元运算符包括:+(取正)、-(取负)、+(自增)、-(自减)。二元运算符包括:+(加)、-(减)、*(乘)、/(除)、%(求余)。“+”与“-”只能用于变量。当“+”或“-”运算符置于变量的左边时,称之为前置运算,
27、表示先进行自增或自减运算再使用变量的值;而当“+”或“-”运算符置于变量的右边时,称之为后置运算,表示先使用变量的值再自增或自减运算。二元运算符的意义与数学意义相同,其中%(求余)运算符是以除法的余数作为运算结果,求余运算也叫求模。例如:int x=7/2+5%3-1;/x的值为4,2.4.1 运算符与表达式类型,2字符串运算符与字符串表达式 字符串运算符只有一个,即“+”运算符,表示将两个字符串连接起来。例如:string s1=abc+123;/s1的值为“abc123”“+”运算符还可以将字符串型数据与一个或多个字符型数据连接在一起,例如:string s2=Hello+你+好;/s2的
28、值为“Hello你好”,2.4.1 运算符与表达式类型,3关系运算符与关系表达式 关系运算又叫比较运算,实际上是逻辑运算的一种,关系表达式的返回值总是布尔值。关系运算符用于对两个操作数进行比较,以判断两个操作数之间的关系。C#中定义的比较操作符有:=(等于)、!=(不等于)、(大于)、=(大于或等于)。关系表达式的运算结果只能是布尔型值,要么是true,要么是false。例如,设置变量i=1、j=2,则关系表达式i!=j的结果为true。,2.4.1 运算符与表达式类型,4逻辑运算符与逻辑表达式 C#语言提供了4类逻辑运算符:&(条件与)或&(逻辑与)、|(条件或)或|(逻辑或)、!(逻辑非)
29、和(逻辑异或)。其中,&、&、|、|和 都是二元操作符,而!为一元操作符。它们的操作数都是布尔类型的值或表达式。&或&表示对两个操作数的逻辑与操作,其区别在于:利用“&”计算时,当第1个操作数为false时,不再计算第2个操作数的值;而利用“&”计算时,则还要计算第2个操作数的值。|或|表示对两个操作数的逻辑或操作,其区别在于:利用“|”计算时,当第1个操作数为true时,不再计算第2个操作数的值。而利用“|”计算时,则还要计算第2个操作数的值。,2.4.1 运算符与表达式类型,4逻辑运算符与逻辑表达式!表示对某个布尔型操作数的值求反,即当操作数为false时,运算结果为true。表示对两个布
30、尔型操作数进行异或运算,当两个操作数不一致时,其结果为true,否则为false。提示:在C#中,“&”、“|”、“”三个运算符可用于将两个整型数以二进制方式进行按位与、按位或、按位异或运算;“”运算符可以进行按位取反运算,“”分别用于左移位和右移位。,2.4.1 运算符与表达式类型,5其他运算符与表达式(1)typeof运算符。typeof操作符用于获取类型的System.Type对象。具体使用方法,如下:Console.WriteLine(typeof(System.Int32);/输出System.Int32Console.WriteLine(typeof(float);/输出Syste
31、m.SingleConsole.WriteLine(typeof(double);/输出System.Double 在C#中,标识一个整型变量时,使用int和System.Int32是同一个效果,typeof操作符就是将C#中的数据类型转化为.NET框架中的类型。,2.4.1 运算符与表达式类型,(2)new运算符。new操作符用于创建一个新的类型实例,通常用于创建一个类的实例。例如:Form frm=new Form();(3)条件操作符。条件操作符“?:”,也称为三元操作符。对条件表达式 b?x:y,先计算条件b,然后进行判断,如果b的值为true,计算 x的值,运算结果为x的值;否则,计
32、算y,运算结果为y的值。三元操作符绝不会既计算x又计算y。条件操作符是从右至左结合的。例如,表达式 a?b:c?d:e 将按 a?b:(c?d:e)形式执行。,2.4.2 运算符的优先级,运算符的优先级,是指当一个表达式中包含多种类型的运算符时,先进行哪种运算。表2-6总结了常用运算符从高到低的优先级顺序。,2.5 引用类型,从数据存储的角度,C#的类型可分为值类型和引用类型。一个具有引用类型的数据并不驻留在栈内存中,而是存储于堆内存中。在堆内存中分配内存空间直接存储所包含的值,而在栈内存中存放定位到存储具体值的索引位置编号。当访问一个具有引用类型的数据时,需要到栈内存中检查变量的内容,而该内
33、容指向堆中的一个实际数据。C#的引用类型包括类、接口、委托、数组和字符串等。,2.5.1 类(class),类是C#面向对象程序设计中最重要的组成部分,是最基本的编程单位,它由若干个数据成员、方法成员等组成。C#中的类需要使用class关键字来进行表示和声明,一个完整的类的定义示例如下:class Student int no;string name;char sex;int score;public string Answer()string result=该考生信息如下:;result+=n学号:+no;result+=n姓名:+name;return result;,2.5.2 接口(i
34、nterface),接口是一种特殊的数据类型,接口与类的关系是:接口负责声明类的标准行为,而类负责实现这些行为。使用接口来设计程序的最大好处是实现了软件设计的规范化和标准化。在C#中,接口类型使用interface进行标识。一个完整的接口示例如下:interface IStudent/声明接口string Answer();注意,方法中不能够包含任何语句。,2.5.3 委托(delegate),委托(delegate)相当于C+中指向函数的指针,但与C+的指针不同,委托完全是面向对象的,它把一个对象实例和方法都进行封装,所以委托是安全的。C#使用delegate来标记一个委托,其一般形式如下:
35、delegate 返回值类型 委托名称(方法参数列表)一个完整的委托示例如下:delegate void MyDelegate();/声明委托其中,MyDelegate是委托的名称,void表示该委托所指向的方法无返回结果,圆括号中没有方法参数列表,表示该委托指向的方法不需要参数。【例2-4】委托的简单应用(Example2_4)。,2.5.3 委托(delegate),其实他们是有区别的,在非托管C/C+中,函数的地址就是一个内存地址。该地址不会携带任何额外的信息,例如函数期望的参数个数、参数类型、函数的返回值类型及函数的调用约定。总之,非托管C/C+中函数指针是非类型安全的。而.NET中的
36、委托是类型安全的,委托会检测他所保存的函数引用是否和声明的委托匹配。,2.5.4 数组(array),数组是指同类数据组成的集合,它是数据最常用的存储方式之一。数组中包含的变量称为数组的元素,数组元素可以是包括数组类型在内的任何类型。C#支持的数组种类:一维数组 规则的多维数组 不规则多维数组 数组能够存储整型、字符串等类型的数据,但是不论数组存储了多少个数据,其中的数据必须是同一种类型。,2.5.4 数组(array),数组的概念 可以把数组看成是很多个变量的集合,这些变量具有相同的类型,它们在内存中是连续存放的,这些变量均具有相同的名称,并且可以通过下标相互区分,每一个这样的变量我们把它称
37、为数组元素。如假设存放300个学生数学成绩的数组名为cj,要求出所有学生的数学的平均分,可使用下列语句:aver=0.0;for(i=0;i300;i+)aver=aver+cji;aver=aver/300;,2.5.4 数组(array),数组的定义 一般而言,数组都必须先声明后使用。在C/C+这样一类语言中,数组在声明时,就要明确数组的元素个数,由编译器分配存储空间。但在C#中数组是一个引用型类型,声明数组时,只是预留一个存储位置以引用将来的数组实例,实际的数组对象是通过new运算符在运行时动态产生的。因此在数组声明时,不需要给出数组的元素个数。,数组的声明与创建,1.一维数组(1)一维
38、数组声明语法形式 type arrayName;其中:type可以是C#中任意的数据类型 表明后面的变量是一个数组类型,必须放在数组名之前arrayName数组名,遵循标识符的命名规则例如:int a1;/a1是一个含有int类型数据的数组 double f1;/f1是一个含有double类型数据的数组 string s1;/s1是一个含有string类型数据的数组,数组的声明与创建,(2)创建数组对象用new运算符创建数组实例,有二种基本形式。声明数组和创建数组分别进行:type arrayName;/数组声明,必须放在数组名前arrayName=new type size;/创建数组实例其
39、中:size表明数组元素的个数 声明数组和创建数组实例也可以合在一起写:type arrayName=new type size;例如:int a1;a1=new int 10;/a1是一个有10个int类型元素的数组string s1=new string 5;/s1是含有5个string类型的数组,数组的声明与创建,2.多维数组(1)多维数组声明语法形式type,arrayName;多维数组就是指能用多个下标访问的数组。在声明时方括号内加逗号,就表明是多维数组,有n个逗号,就是n+1维数组。例如:int,score;/score是一个int类型的二维数组float,table;/table
40、是一个float类型的三维数组,数组的声明与创建,(3)创建数组对象声明数组和创建数组分别进行:type,arrayName;/数组声明arrayName=new type size1,size2,size3;/创建数组实例size1,size2,size3分别表明多维数组每一维的元素个数声明数组和创建数组实例也可以合在一起写:type,arrayName=new type size1,size2,size3;例如:int,score;score=new int 3,4;/score是一个3行4列的二维数组 float,table=new float 2,3,4/table是一三维数组,每维分
41、别是2、3、4,(3)不规则数组一维数组和多维数组都属于矩形数组,而C#所特有的不规则数组是数组的数组,它的内部每个数组的长度可以不同,就像一个锯齿形状。不规则数组声明 type arrayName;方括号 的个数与数组的维数相关。例如:int jagged;/jagged是一个int类型的二维不规则数组创建数组对象以二维不规则数组为例:int jagged;jagged=new int 3;jagged0=new int 4;jagged1=new int 2;jagged2=new int 6;,数组的声明与创建,数组的初始化,1.一维数组初始化语法形式1:type arrayName=n
42、ew type size val1,val2,valn;数组声明与初始化同时进行时,size也就是数组元素的个数必须是常量,而且应该与大括号内的数据个数一致。语法形式2:type arrayName=new type val1,val2,valn;省略size,由编译系统根据初始化表中数据个数,自动计算数组大小。语法形式3:type arrayName=val1,val2,valn;数组声明与初始化同时进行,还可以省略new运算符。语法形式4:type arrayName;arrayName=new type size val1,val2,valn;,数组的初始化,1.一维数组初始化把声明与初
43、始化分开在不同的语句中进行时,size同样可以缺省,也可以是一个变量。例如:以下数组初始化实例都是等同的。int nums=new int 10 0,1,2,3,4,5,6,7,8,9;int nums=new int 0,1,2,3,4,5,6,7,8,9;int nums=0,1,2,3,4,5,6,7,8,9;int nums;nums=new int 10 0,1,2,3,4,5,6,7,8,9;注意:C#中不允许部分初始化。,数组的初始化,2.多维数组初始化多维数组初始化是通过将对每维数组元素设置的初始值放在各自的一个大花括号内完成,以最常用的二维数组为例来讨论。语法形式1:type
44、,arrayName=new type size1,size2 val11,val12,val1n,val21,val22,val2n,valm1,valm2,valmn;数组声明与初始化同时进行,数组元素的个数是size1*size2。语法形式2:type arrayName=new type,val11,val12,val1n,val21,val22,val2n,valm1,valm2,valmn;省略size,由编译系统根据初始化表中花括号的个数确定行数,再根据内的数据确定列数,从而得出数组的大小。,数组的初始化,语法形式3:type,arrayName=val11,val12,val1
45、n,val21,val22,val2n,valm1,valm2,valmn;数组声明与初始化同时进行,还可以省略new运算符。语法形式4:type,arrayName;arrayName=new type size1,size2 val11,val12,val1n,val21,val22,val2n,valm1,valm2,valmn;把声明与初始化分开在不同的语句中进行时,size1,size2同样可以缺省,但也可以是变量。,数组的初始化,例如:以下数组初始化实例都是等同的。int,a=new int 3,4 0,1,2,3,4,5,6,7,8,9,10,11;int,a=new int,0
46、,1,2,3,4,5,6,7,8,9,10,11;int,a=0,1,2,3,4,5,6,7,8,9,10,11;int a;a=new int 3,4 0,1,2,3,4,5,6,7,8,9,10,11;,数组的初始化,3.不规则数组初始化下面以二维不规则数组为例来讨论。不规则数组是一个数组的数组,所以它的初始化通常是分步骤进行的。type arrayName=new type size;size可以是常量或变量,后面一个中括号 内是空着的,表示数组的元素还是数组且这每一个数组的长度是不一样,需要单独再用new运算符生成。arrayName0=new type size0 val1,val2
47、,valn1;arrayName1=new type size1 val1,val2,valn2;,数组的初始化,例如:char st1=new char 3;/st1是由三个数组组成的数组st10=new char S,e,p,t,e,m,b,e,r;st11=new char O,c,t,o,b,e,r;st12=new char N,o,v,e,m,b,e,r;【例】数组的初始化。,数组元素的访问,1.一维数组的引用一维数组的引用语法形式:数组名下标下标数组元素的索引值,实际上就是要访问的那个数组元素在内存中的相对位移,记住相对位移是从0开始的,所以下标的值从0到数组元素的个数-1为止。
48、,数组元素的访问,【例】定义一个数组,存放一组数据,找出这组数中最大数和最小数。using System;class MaxMin public static void Main()int max,min;int queue=new int 10 89,78,65,52,90,92,73,85,91,95;max=min=queue0;for(int i=1;imax)max=queuei;if(queueimin)min=queuei;Console.WriteLine(最大数是0,最小数是1,max,min);,数组元素的访问,2.多维数组的引用 多维数组的引用语法形式:数组名下标1,下标
49、2,下标n【例】求两个矩阵的乘积。假定一个矩阵A为 3 行 4 列,另一个矩阵B为 4 行 3列,根据矩阵乘法的规则,其乘积C为一个 3 行 3 列的矩阵。,数组元素的访问,3、不规则数组的引用:语法形式:数组名下标1下标2下标n示例:打印杨辉三角。1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1 6 15 20 15 6 1,数组与System.Array,在C#中,System.Array类型是所有数组类型的抽象基类型,所有的数组类型均由之派生,这样设计的好处是任何数组都可以使用System.Array具有的属性及方法。例如,System.Arra
50、y有一个Length属性,通过它可以获取数组的长度;有一个GetLength(n)方法,用它可以得到第n维的数组长度(n从0开始)。程序中利用这个属性和方法,可以有效地防止数组下标的越界。System.Array类提供的Clear、Copy、Find、Resize、Sort等方法,可用于清空数组元素的值、复制数组元素、搜索数组元素、更改数组长度和对数组元素进行排序等。【例2-5】数组的简单应用。,数组与System.Array,【例】动态地定义一个数组,存放一组数据,找出这组数中最大数和最小数。using System;class MaxMinpublic static void Main()