NET Framework 與C Sharp語言編程.ppt_第1页
NET Framework 與C Sharp語言編程.ppt_第2页
NET Framework 與C Sharp語言編程.ppt_第3页
NET Framework 與C Sharp語言編程.ppt_第4页
NET Framework 與C Sharp語言編程.ppt_第5页
已阅读5页,还剩177页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1,.NET Framework与 C#语言编程,第3章:C#语言基础,2,.NET Framework与 C#语言编程,第3章 C#进语言基础,第3章:C#语言基础,3,概要内容,本章主要介绍了C#语言的基础知识,内容主要包括数据类型、运算符和表达式、流控制、数组和集合五大部分。 本章是后续章节的基础,学习完本章后,应可以编写简单C#应用程序。,第3章:C#语言基础,4,第3章 C#语言基础,3.1 C#数据类型 3.2 运算符与表达式 3.3 流控制 3.4 数组 3.5 集合,第3章:C#语言基础,5,3.1 C#数据类型,CTS类型 值类型与引用类型 预定义类型 变量 常量 类型转换

2、复合类型 装箱和拆箱,第3章:C#语言基础,6,3.1.1 CTS类型,CTS简介: CTS( Common Type System )公共类型系统,它定义了可以在中间语言使用的预定义数据类型,用于.NET Framework的语言都可以生成最终基于这些类型的编译代码。 公共类型系统不仅指定基本数据类型,还定义了一个内容丰富的类型层次结构。,第3章:C#语言基础,7,C#数据类型,第3章:C#语言基础,8,图中的类型如下表:,第3章:C#语言基础,9,3.1 C#数据类型,CTS类型 值类型与引用类型 预定义类型 变量 常量 类型转换 复合类型 装箱和拆箱,第3章:C#语言基础,10,3.1.

3、2 值类型与引用类型,C语言中,将数据类型分为值类型和引用类型两种。 从概念上看,值类型直接存储其值,而引用类型存储对值的引用。 从在内存中的存储位置上看,值类型变量把数据存储在栈中,引用类型变量把数据存储在堆中。,第3章:C#语言基础,11,3.1.2 值类型与引用类型,值类型与引用类型在内存中的存储,栈,堆,int i 20,int i=20;,“hello”,string s=“hello”;,int j=i;,string t=s;,string s s,int j 20,string t t,第3章:C#语言基础,12,3.1 C#数据类型,CTS类型 值类型与引用类型 预定义类型

4、变量 常量 类型转换 复合类型 装箱和拆箱,第3章:C#语言基础,13,3.1.3 预定义类型,预定义数据类型是由C#语言和.NET框架提供的,每个预定义类型都映射为CTS中定义的类型。 C#中有15个预定义类型,其中有13个值类型和两个引用类型(string和object)。,第3章:C#语言基础,14,3.1.3 预定义类型(值类型),预定义的值类型,第3章:C#语言基础,15,3.1.3 预定义类型(值类型),(1)decimal类型 decimal是C#专门提供的数据类型,精度有28位有效数字,和浮点类型相比,具有更高的精度。它主要适用于金融和货币等领域。 声明并初始化一个decima

5、l类型:,dicimal d12.34M;,第3章:C#语言基础,16,(2)char类型 声明char类型变量时,字符型数据要放在一对单引号之内: C/C+中,char类型表示一个8位字符;而C#中char类型包含16位。,3.1.3 预定义类型(值类型),char myChar=a;,第3章:C#语言基础,17,3.1.3 预定义类型(值类型),(2)char类型 一些字符不能直接放在引号中,必须使用转义字符,这些转义字符如下表所示。,知识点滴:char的双重身份: char的存在具有双重身份。它表示字符但却被看作是整数家族的 一部分,它表示的值是一个无符号的整数,范围在065535。它可

6、 以参与计算,并可以隐式转换成int、long、ushort、uint和ulong。,第3章:C#语言基础,18,3.1.3 预定义类型(值类型),(2)char类型,转义字符表,第3章:C#语言基础,19,3.1.3 预定义类型(引用类型),预定义的引用类型 C#支持两个预定义引用类型,如下表所示:,第3章:C#语言基础,20,3.1.3 预定义类型(引用类型),(1)object类型 C#中,object类型是从所有内在和用户定义的类型中派生而来的最终父类型,所有类型都隐含地最终派生于System.Object类。,第3章:C#语言基础,21,3.1.3 预定义类型(引用类型),(1)ob

7、ject类型 object类型可用于两个目的: 1)可以使用object引用绑定任何特定子类型的对象,例如:,int i=20; object o=i;,第3章:C#语言基础,22,3.1.3 预定义类型(引用类型),(1)object类型 object类型可用于两个目的: 2)object类型执行许多基本的一般用途的方 法,如Equals()、GetHashCode()、GetType() 和ToString()等等。 这些方法将在后面的内容加以介绍。,第3章:C#语言基础,23,3.1.3 预定义类型(引用类型),(2)string类型 字符串变量是包含字母或数字字符的序 列,它可以用来存

8、放计算机或查询操作的输 入信息。 注意:对组成字符串的字符数没有限制。,第3章:C#语言基础,24,3.1.3 预定义类型(引用类型),(2)string类型 声明字符串变量:,string myStr1=“hello”; string myStr2=“world”; string myStr3=myStr1+myStr2;,第3章:C#语言基础,25,3.1.3 预定义类型(引用类型),(2)string类型 字符串中也可以包括转义字符: 结果如下:,知识点滴:string的永恒性 C#中,创建一个string对象后,它所代表的字符集不能修改。当把一个字符串变量赋给另一个字符串时,会得到内存

9、中同一个字符串的两个引用。但是,修改其中一个字符串,注意这会创建一个全新的string对象,而另一个字符串没有改变。,string sample=“hellonworld”;,hello world,第3章:C#语言基础,26,3.1.3 预定义类型(引用类型),(2)string类型 请考虑下边的过程:,栈,堆,string s1=“a string”;,string s2=s1;,s1=“another string”;,string s1 s1,string s2 s2,“anothe string”,“a string”,第3章:C#语言基础,27,(2)string类型 verbat

10、im字符串 通过加前缀,使编译器严格按照原样对其编译。字符串各种格式和转义字符将按原样输出。如:,3.1.3 预定义类型(引用类型),string s=“hellonworld”;,hellonworld,结果输出:,第3章:C#语言基础,28,3.1.3 预定义类型(引用类型),(2)string类型 verbatim字符串 注意:引号是唯一例外,编译器必须将其转义,例如,生成字符串“Hello”的代码如下: 输出结果为:,string s=“ “ “Hello” ” ”;,注意:Hello的两边都有3个引号,“Hello”,注:转义字符处理一对,第3章:C#语言基础,29,3.1.3 预定

11、义类型(引用类型),(2)string类型 Unicode Unicode标准为世界上所有书面语言中用到的每个字符分配了唯一的码值(code point),它之前的标准为ASCII。 欲了解Unicode的详细情况,请登陆网站 ,参照课件和相关书籍熟悉c#中的预定义类型(包括13个值类型和2个引用类型)。,第3章:C#语言基础,30,3.1 C#数据类型,CTS类型 值类型与引用类型 预定义类型 变量 常量 类型转换 复合类型 装箱和拆箱,第3章:C#语言基础,31,3.1.4 变量,(1)声明变量 语法: 例如: 该语句用public访问级声明int变量i。,m

12、odifiers datatype identifier;,public int i;,第3章:C#语言基础,32,3.1.4 变量,(2)标识符(identifier) 标识符识给变量、用户定义的类型和这些类型的成员指定的名字。C#变量命名的基本规则: 变量名首字符必须是字母、下划线(“_”)或 “”; 其后字符必须是字母、下划线或数字; 切忌使用C#关键字。如果需要使用,须在标识符前边加上“”(如abstract)。,第3章:C#语言基础,33,3.1.4 变量,(2)标识符(identifier) 练习:下边哪些变量的命名是正确的 myBigVar 99BottleOfBeer name

13、space VAR1 _test Its-All-Over,第3章:C#语言基础,34,3.1.4 变量,(2)标识符(identifier) 以下列出了命名变量的一些规则: 给变量分配有意义的名称; 命名类和方法时使用Pascal样式,命名变量使用Camel样式。 不要通过大小写的不同来区分变量。,第3章:C#语言基础,35,(3)初始化变量 变量声明后,我们必须初始化该变量。,3.1.4 变量,class Test static void Main() int myTest = 8; System.Console.WriteLine(myTest); ,int myTest;,第3章:C#

14、语言基础,36,3.1.4 变量,(3)初始化变量 另外,注意初始值要与声明的类型相一致 可以通过附加后缀来指定数值类型,decimal bankBalance=34.50; /错误,decimal bankBalance=34.50M; /正确,第3章:C#语言基础,37,3.1.4 变量,(3)初始化变量 可使用的后缀如下表:,第3章:C#语言基础,38,3.1.4 变量,(4)变量的作用域 变量的作用域是可以访问该变量的的代码区域。作用域的确定规则: 只要字段所属的类在某个作用域内,其字段也在该作用域内; 局部变量存在于表示声明该变量的块语句结束的封闭花括号之前的作用域内; 在循环或类似

15、的语句中声明的局部变量存在于该循环体内。,第3章:C#语言基础,39,3.1.4 变量,(5)字段和局部变量 考虑下边的代码:,using System; class ScopeTest static int j=20; public static void Main() int j=30; Console.WriteLine(j); return; ,定义了两个j,能通过编译吗?,第3章:C#语言基础,40,3.1.4 变量,(5)字段和局部变量 C使得在变量之间有一个基本的区分,它把声明为类型级的变量看作是字段,而把在方法中声明的变量看作局部变量。 所以前边的代码可以通过编译,运行结果是3

16、0!此时,在Main方法中声明的变量j隐藏了同名的类级别的变量。,第3章:C#语言基础,41,3.1.4 变量,(6) 修饰符 修饰符用于限定类型以及类型成员的声明。C#语言共有13种修饰符,按功能可以分成3部分: 类修饰符 成员修饰符 访问修饰符,第3章:C#语言基础,42,3.1.4 变量,(6) 修饰符 类修饰符,类修饰符,第3章:C#语言基础,43,3.1.4 变量,(6)修饰符 成员修饰符,第3章:C#语言基础,44,3.1.4 变量,(6)修饰符 访问修饰符,第3章:C#语言基础,45,3.1.4 变量,(6)修饰符 以下是访问修饰符的一些规则: 命名空间总是默认为public;

17、类总是默认为public; 类成员默认为private;(与C+不同) 对于一个类成员只能使用一个访问修饰符,protected internal尽管是2个单词,但它是单个访问修饰符; 成员的作用域永远不超出包含它的类。,第3章:C#语言基础,46,3.1 C#数据类型,CTS类型 值类型与引用类型 预定义类型 变量 常量 类型转换 复合类型 装箱和拆箱,第3章:C#语言基础,47,3.1.5 常量,语法: 注意:声明常量时必须对其赋值。 例:,const type-name constant = value;,const float pi=3.14f; const int earthRadi

18、us=6378;,第3章:C#语言基础,48,3.1 C#数据类型,CTS类型 值类型与引用类型 预定义类型 变量 常量 类型转换 复合类型 装箱和拆箱,第3章:C#语言基础,49,3.1.6 类型转换,考虑下边一段代码:,class Value static void Main() byte value1=10; byte value2=23; byte total; total=value1+value2; System.Console.WriteLine(total); ,第3章:C#语言基础,50,3.1.6 类型转换,为什么编译器会报错呢? 因为把两个byte加在一起时,结果返回in

19、t。如要把结果存储在一个byte中,就必须把它转回byte类型。 C#提供了两种类型转换方式:,第3章:C#语言基础,51,3.1.6 类型转换,隐式转换(implicit conversion) 显式转换(explicit conversion),第3章:C#语言基础,52,3.1.6 类型转换,(1)隐式转换方式,A,B,代表可以隐式从类型A转换到类型B,第3章:C#语言基础,53,3.1.6 类型转换,(1)隐式转换方式,C#支持的隐式类型转换,第3章:C#语言基础,54,3.1.6 类型转换,(1)隐式转换方式: 根据上表可知,如果将total声明为long型,程序就会通过编译。 by

20、te total; long total;,知识点滴:一元数字提升 只要一元加()或一元()操作符作用于sbyte、byte、short或char类型的操作数,数字表达式的类型就会变成int. 如果一元加操作符应用于uint类型的操作数,表达式的类型将为long.,第3章:C#语言基础,55,3.1.6 类型转换,(1)隐式转换方式: 另外,关于数值类型的隐式转换,还有几点问题需要说明: 只能从范围较小的整数类型隐式转换为范围较大整数类型; 有符号数据类型不可以向无符号数据类型转换,例如不可以将short类型变量向ushort类型变量转换,也不可以向uint类型转换; 字符变量可以向数值类型转

21、换,但是由数值类型向字符类型的隐式转换不成立;,第3章:C#语言基础,56,3.1.6 类型转换,(1)隐式转换方式: 另外,关于数值类型的隐式转换,还有几点问题需要说明: 浮点类型数据不可以向小数类型转换。整数类型、字符类型数值可以向小数类型转换; 可以从int、uint、long数据类型向单精度数据类型转换,当进行这一过程或者从long数据类型向双精度数据类型转换时,可能引起丢失数据精度的情况。,不用显式转换,是否可以用一个int类型的值给short类型的变量赋值?请课后上机验证一下你的结果。,第3章:C#语言基础,57,3.1.6 类型转换,(2)显式转换方式: 语法如下: 例:,typ

22、e variable1=(cast-type)variable2;,int x=500; short z=(short)x;,第3章:C#语言基础,58,3.1.6 类型转换,(2)显式转换方式: 考虑下边的代码:,decimal d=1234.56M; int x=(int)d;,转换的结果是,x值为1234,long val=3000000000; int i=(int)val;,编译器不会报错,但i中结果却是-1294967296,第3章:C#语言基础,59,3.1.6 类型转换,(2)显式转换方式: 注意:显式转换是一种危险操作,它可能导致数据丢失,或数据溢出,从而得不到所需的结果,所

23、以在执行显式转换之前一定要清楚自己在做什么。,第3章:C#语言基础,60,3.1 C#数据类型,CTS类型 值类型与引用类型 预定义类型 变量 常量 类型转换 复合类型 装箱和拆箱,第3章:C#语言基础,61,3.1.7 复合类型,除了前面介绍的预定义类型外,C#和.NET Framework还允许用户根据这些简单类型定义复合类型。 与基本类型一样,复合类型可以分为值类型和引用类型,第3章:C#语言基础,62,3.1.7 复合类型(值类型),(1)结构(struct) 语法:,modifier struct identifier:interface member of struct; ,第3章

24、:C#语言基础,63,3.1.7 复合类型(值类型),(1)结构(struct) member of struct包括: 构造函数(Constructor)、常数(Destructor)、 字段(Fields)、方法(Methods)、 属性(Attribute)、索引(Indexes)、 操作符(Operators)和嵌套(Nested)类型。,第3章:C#语言基础,64,3.1.7 复合类型(值类型),(1)结构(struct) 示例:定义一个学生结构类型,用于存储某大学计算机系的学生信息,包括:学号、姓名和入学时间等,通过学生学号计算学生考试时的准考证号,其计算规则是: 准考证号=学号*

25、2-1000,第3章:C#语言基础,65,using System; struct Student public long number; public string name; public int age; public static string department=Computer; public Student(int a) number=0; name=; age=0; public long testNumber() return (number*2-1000); ,构造函数 注意:必须要有参数,定义字段成员,定义方法成员,程序代码如下:,第3章:C#语言基础,66,class

26、 Test public static void Main() Student studExap; studExap.number=1234; studE=xiaoFeng; studExap.age=19; Console.WriteLine(学生的个人信息如下:); Console.WriteLine(“学生学号0 学生姓名=1 年龄 =2 所在系=3“, studExap.number,studE,studExap.age, Student.department); Console.WriteLine(准考证号是:0,studExap.testNumber

27、(); ,创建结构类型实例,通过结构类型变量访问实例字段,通过结构名访 问静态字段,通过结构类型变量访问实例方法,第3章:C#语言基础,67,3.1.7 复合类型(值类型),(1)结构(struct) 从功能上看结构就像一个小型的类,但二者还是有很大区别的: 第一,结构是一个值类型,它存储在栈中,而类是一个引用类型,它存储在堆中。,第3章:C#语言基础,68,3.1.7 复合类型(值类型),(1)结构(struct) 第二,结构不允许继承。 第三,在结构中不允许声明一个没有参数的构造函数,而类是允许的。,第3章:C#语言基础,69,3.1.7 复合类型(值类型),(1)结构(struct) 第

28、四,在结构中不允许不允许有实例字段初始值设定项。,public struct Rect public int x1=1; ,第3章:C#语言基础,70,3.1.7 复合类型(值类型),(1)结构(struct) 第五,利用结构类型来声明对象的时候不可使用new运算符初始化。 另外,创建结构对象后,一定要对结构成员进行初始化。,myRect=new rect(); /错误 rect myRect; /正确,第3章:C#语言基础,71,3.1.7 复合类型(值类型),(2)枚举类型 枚举类型是指一组已命名的数字常量。 语法:,modifiers enum identifier :base-type

29、 enumerator-list;,第3章:C#语言基础,72,3.1.7 复合类型(值类型),示例:声明和初始化一个枚举类型,Enum Planet Mercury=2437, Venus=6905, Earth=6378, ;,第3章:C#语言基础,73,3.1.7 复合类型(值类型),(2)枚举类型 注意: 没有赋值的枚举成员都会自动获得一个初始值。 可以在类或命名空间中声明枚举,但不能在方法中声明,Enum DaysSat,Sun,Mon,Tue,Wed,Thu,Fri,第3章:C#语言基础,74,3.1.7 复合类型(值类型),(2)枚举类型 枚举的使用: 若要使用枚举成员,需要使用

30、枚举名、英文句点,并对其赋值。 考虑下边的代码,第3章:C#语言基础,75,using System; enum orientation:byte north=1, south=2, east=3, west=4 public class EnumTest public static void Main() orientation myDirection=orientation.north; Console.WriteLine(“myDirection=0”,myDirection); ,第3章:C#语言基础,76,3.1.7 复合类型(值类型),(2)枚举类型 运行结果为:,第3章:C#语言

31、基础,77,3.1.7 复合类型(值类型),(2)枚举类型 枚举成员的基本类型默认为int,但还可以是除了char类型以外的任何整数类型。,Enum Planet :uint Mercury=2437, Venus=6905, Earth=6378, ;,第3章:C#语言基础,78,3.1.7 复合类型(引用类型),复合引用类型包括类、接口、委托和数组。 类 类在C和.NET Framework中是基本的用户定义类型。几乎所有的C可执行文件都至少有一个类,其中包含Main方法程序的入口。类包括数据成员(字段、常量和事件)和函数(主要是方法和属性,但也包含运算符等);换言之,类封装了数据以及访问

32、和操作这些数据具的功能。类也可以包含嵌套类。,第3章:C#语言基础,79,3.1.7 复合类型(引用类型),接口 接口用于为实现它们的类定义功能。它们可以包含属性、方法、事件和索引符等,单接口不能被实例化,也没有定义这些函数的执行方法。例如,如果接口包含一个方法,它将定义该方法的返回类型和参数,但不包含执行该方法的任何代码。执行这个接口的任何类都需要提供该方法的执行方式。,第3章:C#语言基础,80,3.1.7 复合类型(引用类型),委托 委托是指引用方法的类型,类虽然类似C中的函数指针,但允许实例化和调用类的静态方法,也可以调用类的制定实例的方法。委托允许确定运行时要调用哪些方法。,第3章:

33、C#语言基础,81,3.1.7 复合类型(引用类型),数组 数组一个元素序列。同一个数组中的所有元素具有相同的类型,。一个数组中的所有元素位于一个连续的内存块中,并可以通过使用整数索引来访问它们。当程序需要处理一组有序的相似元素时,使用数组更为灵活有效。数组可以时一维或多维的。,第3章:C#语言基础,82,3.1 C#数据类型,CTS类型 值类型与引用类型 预定义类型 变量 常量 类型转换 复合类型 装箱和拆箱,第3章:C#语言基础,83,3.1.8 装箱和拆箱,(1)装箱(Boxing) 考虑下边的代码: 问题: int不过是栈上一个4字节的值,它是如何调 用方法的?,string s=10

34、.ToString();,第3章:C#语言基础,84,3.1.8 装箱和拆箱,(1)装箱(Boxing) C#提供了一个有点魔术性的方式装箱! 装箱可以把值类型转换为引用类型,上例中的该转换是隐式进行的,还可以手工转换:,int i=20; object o=i;,第3章:C#语言基础,85,3.1.8 装箱和拆箱,(1)装箱(Boxing) 第二条初始化语句中,o包含的引用并不指向i,因为i在栈中,引用指向栈将严重影响程序的健壮性(还会产生潜在的安全漏洞)。 作为替代,在堆中会产生i的一个精确拷贝,并将变量o的引用指向该拷贝 这种自动拷贝就是装箱!,第3章:C#语言基础,86,3.1.8 装

35、箱和拆箱,(1)装箱(Boxing) 装箱过程如下图所示,栈,堆,int i 20,object o,int i=20;,object o=i;,装箱,20,第3章:C#语言基础,87,3.1.8 装箱和拆箱,(2)拆箱(Unboxing) 拆箱用于把引用类型转换为值类型,其中引用类型的值转换为值类型。 其语法类似于显式类型转换:,object o=42; int i=(int)o;,第3章:C#语言基础,88,3.1.8 装箱和拆箱,(2)拆箱(Unboxing) 拆箱过程如下图所示,栈,堆,object o,int i=(int)o;,object o=42;,42,int i=(int)

36、o 42,拆箱,第3章:C#语言基础,89,3.1.8 装箱和拆箱,(2)拆箱(Unboxing) 需要注意的是,在把引用类型转为值类型的时候,必须确保得到的值变量有足够的空间存储值类型中所有的字节。 例:,long a=33333423; object b=(object)a; int c=(int)b;,CLR会抛出一个异常:“未处理的异常:system.InvalidCastException:指定的转换无效”,返回,第3章:C#语言基础,90,堆和栈,计算机内存从概念上被分成许多独立的部分,堆和栈是其中的两种: 栈 用来存放程序的局部数据,即各个函数中的数据。当调用一个方法时,就需要为

37、它的参数和局部变量分配内存。这些内存总是从栈中获得。当方法结束(由于返回或抛出异常)时,其参数和局部变量所占用的内存会自动释放回栈中。,第3章:C#语言基础,91,堆和栈,计算机内存从概念上被分成许多独立的部分,堆和栈是其中的两种: 堆 存放程序的动态数据。当使用new关键字和调用构造函数来创建一个对象时,就需要该对象分配内存。对象的内存总是从堆中获得。当方法结束(由于返回或抛出异常)时,对象所占用的内存并不会自动释放回堆中。,返回,第3章:C#语言基础,92,3.1 C#数据类型,CTS类型 值类型与引用类型 预定义类型 变量 常量 类型转换 复合类型 装箱和拆箱,第3章:C#语言基础,93

38、,C#关键字表,返回,第3章:C#语言基础,94,3.2 运算符与表达式,运算符 运算符的优先级,第3章:C#语言基础,95,3.2.1 运算符,C#语言继承了C/C+原有所有运算符,并在此基础上增添了几个新的运算符,详见下页表。 另外,根据运算符所使用的操作数(运算符所操作的变量或常量) 个数,可分为3类: 一元运算符 二元运算符 三元运算符,第3章:C#语言基础,96,C#运算符,第3章:C#语言基础,97,(1)三元运算符 三元运算符?:是ifelse的简化形式。其语法如下: 它等价于:,3.2.1 运算符,condition?true_value:false_value;,if(con

39、dition) true_value; else false_value;,第3章:C#语言基础,98,3.2.1 运算符,(2)checked和unchecked运算符 C#检查代码中的溢出: 把代码块标记为checked,CLR就会执行溢出检查,若发生溢出,则抛出异常。 如要禁止溢出检查,可把代码标记为unchecked。,第3章:C#语言基础,99,3.2.1 运算符,(2)checked和unchecked运算符 考虑下边两段代码,byte b=255; checked b+; ,byte b=255; unchecked b+; ,CLR会抛出异常:“未处理的异常:System.Ov

40、erflowException:算术运算导致溢出”,不会抛出异常,但会丢失数据,结果是b=0,第3章:C#语言基础,100,3.2.1 运算符,(2)checked和unchecked运算符 注意: 用/checked选项进行编译,就可以检查程序中所有为标记代码中的溢出; unchecked是默认值。,第3章:C#语言基础,101,3.2.1 运算符,(3)is运算符 is运算符可以检查对象是否与特定的类型兼容。 兼容,是指对象是该类型,或者派生于该类型。,第3章:C#语言基础,102,3.2.1 运算符,(3)is运算符 考虑下边的代码段 结果如下: i is an object,int i

41、=10; if(i is object) Console.WriteLine(“i is an object”); ,第3章:C#语言基础,103,3.2.1 运算符,(4)as运算符 “as”是C#特有运算符,一般形式是: 表达式1=表达式2 as 类型; as意义是:如表达式2的值符合给定类型,则表达式1等于表达式2的值,否则,表达式1等于null。,第3章:C#语言基础,104,3.2.1 运算符,例如: 注意:表达式1和表达式2必须是引用类型的变量或者常量。,object o=5.4F; object f; f=o as float;,结果f=5.4F,第3章:C#语言基础,105,3

42、.2.1 运算符,(5)sizeof运算符 sizeof可以确定栈中值类型需要的长度,。 例如: int b=sizeof(int); 注意!只能在不安全代码中使用sizeof,结果b中将存储值4,第3章:C#语言基础,106,3.2 运算符与表达式,运算符 运算符的优先级,第3章:C#语言基础,107,3.2.2 运算符的优先级,运算符的优先级:是指在不同运算符混合使用时,运算进行时的顺序。 C#运算符的优先级如下页表所示。表的顶部的运算符有最高的优先级。,第3章:C#语言基础,108,C#运算符优先级,第3章:C#语言基础,109,3.3 流控制,条件语句 循环语句 跳转语句,第3章:C#

43、语言基础,110,3.3.1 条件语句,(1)if语句 if语句是根据测试条件是否满足来选择要执行的语句的。 语法如下,if (condition) statement(s); else statement(s);,if (condition1) statement(s); else if(condition2) statement(s); else if(conditionN) statement(s); else statement(s);,或者,第3章:C#语言基础,111,(1)if语句 示例:if语句的使用 需要注意的是,与C/C+不同,C#中if语句的条件表达式必须等于布尔值。,3

44、.3.1 条件语句,if(sales1000) bonus+=.05*sales; else if(sales500) bonus+=.01*sales; else bonus=0;,第3章:C#语言基础,112,3.3.1 条件语句,(2)switch语句 swictch语句可以根据某个带测试参数的值来选择要执行的代码。它适用于参数表达式有多个值的情况。 switch语句的语法与C/C+很相似,其形式是switch参数的后边跟一组case子句,可以用default捕捉所有不符合case标识的值。,第3章:C#语言基础,113,3.3.1 条件语句,(2)switch语句 示例:switch语

45、句的使用,switch(contry) case “America”: case “Britain”: language=“English”;break; case “China”: language=“Chinese”;break; default language=“unknow”;break; ,组合case,多个case标记可以共用同一处理语句,与C/C+不同,C#要求必须包含break,goto或return等可以控制程序流程的语句,第3章:C#语言基础,114,3.3 流控制,条件语句 循环语句 跳转语句,第3章:C#语言基础,115,3.3.2 循环语句,(1)for循环 语法:

46、 示例:输出数099的代码片断,for (initializer; condition; iterator) statement(s);,for (i=0;i100;i+) System.Console.WriteLine(i); ,第3章:C#语言基础,116,int i=1; int sum=0; while(i=1000) sum+=i+;,3.3.2 循环语句,(2)while循环 语法: 示例:求 的代码片断,while (condition) statement(s);,第3章:C#语言基础,117,(3)dowhile循环 语法 示例:求 的代码片断,3.3.2 循环语句,do

47、statement(s); while (condition);,int i=1,sum=0; do sum+=i+; while(i=999),第3章:C#语言基础,118,3.3.2 循环语句,(4)foreach循环 foreach语句可以迭代集合中的每个项目。集合的例子有数组、System.Collection命名空间中的集合类、以及用户定义的集合类。集合的概念将在后面详细介绍。 语法:,foreach (type identifier in expression) Statement(s);,代表集合元素的循环变量,对象集合表达式,第3章:C#语言基础,119,3.3.2 循环语句,

48、(4)foreach循环 示例:foreach语句的使用(设arrayOfInt是整型数组) 上边的代码片断循环一次就迭代数组中的一个元素,并将之输出,直到遍历完所有数组元素为止。,foreach (int temp in arrayOfInt) System.Console.WriteLine(temp); ,第3章:C#语言基础,120,3.3 流控制,条件语句 循环语句 跳转语句,第3章:C#语言基础,121,3.3.3 跳转语句,(1)goto语句 goto语句可以直接跳转到程序中用标签指 定的另一行。 例:,Goto Label1; System.Console.WriteLine(

49、“This wont be executed!”); Label1: System.Console.WriteLine(“Continuing execution from here!”);,标签:一个标识符,后跟一个冒号,此行将不被执行,第3章:C#语言基础,122,3.3.3 跳转语句,(1)goto语句 使用goto限制: 不能跳转到像for循环这样的代码块中, 不能跳出类的范围,不能跳出trycatch块 后面的finally块。 注意:不提倡使用goto语句,它会使程序流程变得相当混乱!,第3章:C#语言基础,123,3.3.3 跳转语句,(2)continue和break语句 co

50、ntinue语句用来退出当前循环,然后在循环的下一次迭代开始执行。 break语句用来退出循环。它还可以用于switch语句,用来退出某个case语句。代码的执行点转向循环语句或switch语句后面的语句。,第3章:C#语言基础,124,3.3.3 跳转语句,(3)return语句 return语句用来退出类的方法,把控制返回方法的调用者。 如果方法有返回类型,return语句必须返回这个类型的值。,第3章:C#语言基础,125,3.3 流控制,条件语句 循环语句 跳转语句,第3章:C#语言基础,126,3.4 数组,数组是包含相同数据类型元素的一种数据结构。数组中的所有元素位于一个连续的内存

51、中,可以通过使用整数索引来访问。 在C#中,数组属于引用类型,即使数组包括值类型的元素,数组本身也属于引用类型。数组可以是一维或多维的。,第3章:C#语言基础,127,(1)声明数组变量 一维数组 多维数组 上边的声明只是创建了一个各维长度不确定的数组的空引用。,3.4 数组,type arrayName;,type , , arrayName;,第3章:C#语言基础,128,tpye arrayName; arrayName=new typelength;,3.4 数组,(2)创建数组实例 一维数组 或,tpye arrayName=new typelength;,第3章:C#语言基础,12

52、9,3.4 数组,(2)创建数组实例 多维数组C#支持两种类型的多维数组: 矩形数组:每维长度相同的数组称为矩形数组; 正交(锯齿形)数组:每一维的长度可以不同的数组称为正交(锯齿形)数组。,第3章:C#语言基础,130,3.4 数组,(2)创建数组实例 矩形数组 正交(锯齿形)数组(以2维数组为例),type, arrayName=new typedim0,dimN-1;,type arrayName=new typedim0; arryName0=new typedim1_0; arryName1=new typedim1_1;,第二维的长度未定,没有使用逗号,而是使用方括号表示维数,仍然

53、需要初始化每维的长度,第3章:C#语言基础,131,3.4 数组,(3)初始化数组元素 C#中,根据数组实例中所有元素的类型,这些元素将被初始化为一个默认值: 内置数据类型(例如int)元素初始化为0,枚举型元素也初始化为0(即使它们的枚举值都不是0); Bool类型元素初始化为false; 引用类型元素初始化为null。,第3章:C#语言基础,132,3.4 数组,(3)初始化数组元素 可以根据需要初始化数组元素为特定值,有两种方法: 一种是声明数组时初始化它的元素,如:,string names=“Mark”, “Maria”, “Scott”; string, names=“Diana”

54、, “Reid”, “Chery1”, “Spada” ;,第3章:C#语言基础,133,3.4 数组,(3)初始化数组元素 可以根据需要初始化数组元素为特定值,有两种方法: 另一种方法是给某个数组元素赋给一个值,它的好处是可以在任意地方赋值,如:,string names=new string3; name0=“Mark”;,第3章:C#语言基础,134,3.4 数组,(4)Array方法 在C中,通过.NET框架中的System.Array类来支持数组,它是一个抽象类,提供了一些可以用来操作数组的方法,如下表。,第3章:C#语言基础,135,3.4 数组,(5)数组拷贝 考虑下边的代码片断

55、 数组是引用类型,数组变量包含了对数组实例的引用。上边代码拷贝了数组变量,这就意味着将得到两个引用,它们引用同一个数组实例。,int pins=9,3,2,7; int alias=pins;,第3章:C#语言基础,136,3.4 数组,(5)数组拷贝 拷贝某个数组变量的实例,必须: 创建一个和原数组类型和大小相同的数组; 使新数组和原数组中的元素值一一对应。 例如:,int pins=9,2,3,7; int copy=new intpins.Length; for(int i=0 ; i != copy.Length ; i+) copyi=pinsi;,第3章:C#语言基础,137,pu

56、blic class ParamExample public int sum(int list); static void Main int tester=1,2,3,4,5,6 int total=sum(tester); ,3.4 数组,(6)params关键字 数组可以作为方法的参数,不过这需要在定义方法和使用方法时都要创建数组。 例如:,第3章:C#语言基础,138,3.4 数组,(6)params关键字 使用params关键字,可以不用创建数组,具体实现如下:,public class ParamExample public int sum(int a,int b,params in

57、t list); static void Main int total=sum(1,2,3,4,5,6,7); ,此例中,调用方法后参数a=1;b=2; list=3,4,5,6,7,第3章:C#语言基础,139,3.4 数组,(6)params关键字 使用params关键字,需要注意以下几点: 1)params关键字只能修饰一维数组,而且params数组必须是最后一个参数。 2)不能仅基于params关键字来重载方法。 例如:,public static int Min(int array) public static int Min(params int array),error CS01

58、11:已经定义了一个具有相同参数类型的名为 “Min”的成员。,第3章:C#语言基础,140,3.4 数组,(6)params关键字 使用params关键字,需要注意以下几点: 3)不允许对params数组使用ref和out关键字。 4)类型转换规则适用于params参数。 5)没有使用params数组的方法总是比使用了params数组的方法优先级高。,第3章:C#语言基础,141,3.4 数组,(6)params关键字 使用params关键字,需要注意以下几点: 6)编译器可以检测并拒绝具有潜在两义性的重载,例如:,public static int Min(params int array) public static int Min(int a,params int array),error CS0121:在以下方法或属性之间的调用不明确: ,第3章:C#语言基础,142,3.5 集合,在System.Collection命名空间中,有一些用来定义对象集合的类和接口,这些对象集合提供了许多种不同的数据结构来管理数据。 下表描述了这些类,并通过示例说明了它们的最佳用途,第3章:C#语言基础,143,3.5 集合,C#中的常用集合类,第3章:C#语言基础,144,3.5 集合,ArrayList类 Queue类 Stack类 Hash

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论