《c#程序设计week》由会员分享,可在线阅读,更多相关《c#程序设计week(26页珍藏版)》请在金锄头文库上搜索。
1、第2章 数据类型与流程控制,2.1 C#语言概述 C#语言的设计目的是简化网络应用。使用C#语言能够迅速构建基于Windows操作系统和Internet的应用程序组件。设计者可以用C#语言编写多种类型的应用程序。,第2章 数据类型与流程控制,2.1.1 C#语言的特点 (1)简洁的语法 C#语言和Java语言一样,使用了统一的操作符,淘汰了C+语言中乱糟糟的表示符号和伪关键字,使用最简单、最常见的形式进行描述。 (2)精心的面向对象设计 C#语言是完全按照面向对象的思想来设计的,因此它具有面向对象所应有的一切特性:封装、继承与多态性。 C#语言只允许单继承,即一个类不会有多个基类,从而避免了类
2、型定义的混乱。在C#语言中,每种类型都是一个对象,因此不存在全局函数、全局变量和全局常数等概念,所有常量、变量、属性、方法、索引和事件都必须封装在类中,从而使代码具有更好的可读性,也减少了发生命名冲突的可能。,第2章 数据类型与流程控制,2.1.1 C#语言的特点 (3)与Web的紧密结合 在C#语言中,对于复杂的Web编程和其他网络编程更像是对本地对象进行操作,从而简化了大规模、深层次的分布式开发。用C#语言构建的组件能够方便地为Web服务并可以通过Internet被运行在任何操作系统上的任何格式所调用。 (4)完全的安全性与错误处理 语言的安全性与错误处理能力是衡量一种语言是否优秀的重要依
3、据,C#语言可以消除许多软件开发中的常见错误,并提供了包括类型安全在内的完整安全性能。 在默认情况下,从Internet和Intranet下载的代码都不允许访问任何本地文件和资源;C#语言不允许使用未初始化的变量,并提供了边界检查与溢出检查等功能。内存管理中的垃圾回收机制也大大减轻了开发人员对内存管理的负担。,第2章 数据类型与流程控制,2.1.2 C#语言与其他语言的比较 1、C#语言与C+语言的比较 编译目标:C+代码直接编译为本地执行的代码,而C#语言默认编译为中间语言(IL)代码,执行时再通过Just-In-Time将需要的模块临时编译成本地代码。 内存管理:C+语言需要程序员显示地删
4、除动态分配给堆的内存,而C#语言不需要这么做,C#语言采用垃圾回收机制自动在合适的时机回收不再使用的内存。 指针:C+语言中大量地使用指针,而C#语言使用对类实例的引用,如果确实想在C#语言中使用指针,必须声明是非安全的,不过,一般情况下在C#语言中没有必要使用指针。 字符串处理:在C#语言中,字符串是作为一种基本数据类型来对待的,因此比C+语言中对字符串的处理要简单得多。 C+语言允许类的多继承,而C#语言只允许类的单继承,但可以通过接口实现多继承。,第2章 数据类型与流程控制,2.1.2 C#语言与其他语言的比较 2、C#语言与Java语言的比较 从语法上讲,C#语言和Java语言非常相似
5、,只是在细节上有一些差别。实际上,C#语言和Java语言的主要差别不是在语言本身,而是在它们所执行的平台上。 Java程序需要一个运行环境JRE(Java Runtime Environment)来执行代码,但JRE只限于在Java这一门语言中使用。C#语言也需要一个运行环境CLR(Common Language Runtime),但是CLR提供了对多种语言的支持。 Java源代码可以被编译成字节代码的一种中间状态,然后由已提供的虚拟机来执行这些字节代码。C#代码也被编译成一种中间状态,称为中间语言(IL),但是IL代码则被传输到由CLR管理的执行进程上,然后通过CLR的JIT编译器编译成本地
6、代码执行。 C#语言与Java语言相比也有很多不同和改进之处。例如,C#语言的文件名不受文件中类名的限制,而在Java语言中则有此限制。另外,C#语言也提供了一些在Java语言中没有的功能,如运算符重载、封箱和装箱,以及方法隐藏等。,第2章 数据类型与流程控制,2.1.2 C#语言与其他语言的比较 3、C#语言与VB.NET语言的比较 和C# 语言一样,VB.NET语言也是基于.NET framework和CLR的高级语言。但是C#语言有一些VB.NET语言所不具备的都有的特性,例如,C#语言可以使用非托管代码、移位操作符、内嵌的文档(XML)和运算符重载等。在发展前景上,由于C#语言一开始就
7、是完全按照面向对象的思想来设计的,而且它使用的全部是.NET框架定义的语法格式,不存在考虑与.NET之前版本兼容的问题,因此给人的感觉是结构清晰,语法简洁、优雅。另外,C#语言作为一种高级语言标准,其基本的内部实现形式是公开的,因此更容易被多种平台接受和广泛地应用。当然,VB.NET语言也有其自身的优点,例如以前学习过VB的人既可以使用.NET之前的语法格式及函数,也可以使用.NET规定的语法格式和面向对象的设计思想。,2.2 C#数据类型 C#数据类型可以分为两类:值类型和引用类型。值类型包括简单类型、枚举类型和结构类型;而引用类型包括类类型、接口类型、数组类型和委托类型。 值类型和引用类型
8、的区别在于,值类型的变量直接存放实际数据,而引用类型的变量存放的则是数据的地址,即对象的引用。 值类型变量直接把变量的值保存在堆栈中,引用类型的变量把实际数据的地址保存在堆栈中,而实际数据则保存在堆中。注意:堆和堆栈是两个不同的概念,在内存中存储位置也不相同,堆一般用于存储可变长度的数据,如字符串类型;而堆栈则用于存储固定长度的数据,如整型类型的数据int(每个int变量占用4个字节)。由数据存储的位置可以得知,当把一个值变量赋给另一个值变量时,会在堆栈中保存两个完全相同的值;而把一个引用变量赋给另一个引用变量,则会在堆栈中保存对同一个堆位置的两个引用,即在堆栈中保存的两个数据是同一个堆的地址
9、。在进行数据操作时,对于值类型,由于每个变量都有自己的值,因此对一个变量的操作不会影响到其它变量;对于引用类型的变量,对一个变量的数据进行操作就是对这个变量在堆中的数据进行操作,如果两个引用类型的变量引用同一个对象,实际含义就是它们在堆栈中保存的堆的地址相同,则对一个变量的操作就会影响到引用同一个对象的另一个变量。,2.2 C#数据类型 表2-2列出了值类型和引用类型的具体区别。,2.2 C#数据类型 除了这两种类型以外,在非安全代码中也可以使用指针类型。,2.2 C#数据类型 2.2.1 值类型 值类型包括简单类型、枚举类型和结构类型。简单类型包括整数类型、浮点型、小数型、布尔型、字符型。
10、声明值类型的语法形式为 =n; 其中,指当前所要定义的变量的类型;指当前所要定义的变量的名称;=n是可选项,用于在定义变量的同时初始化该变量,即为变量赋初值;n为所要赋的初值。 例如: int a=100; /声明一个整型变量a,并赋初值为100 也可以采用先定义后赋值的方式,例如: int a; /声明一个整型变量a a=100; /为整型变量a赋值100 注意:C#语言不允许使用未初始化的变量。如果在变量定义时未进行初始化,那么在使用该变量之前必须先赋值,否则会在编译时报错。 另外,也可以把几个变量声明用一条语句完成,例如: int a=100,b,c=200,d; /声明整型变量a、b、
11、c、d,并将a赋值100,c赋值200,2.2 C#数据类型 2.2.1 值类型 1、整数类型 由于计算机的机器字长限制,所以计算机内所有数据都是以一定位数的整数来表示的。根据变量在内存中所占的位数的不同,C#语言中提供了9种整数类型:短字节型(sbyte)、字节型(byte)、短整型(short)、无符号短整型(ushort)、整型(int)、无符号整型(uint)、长整型(long)、无符号长整型(ulong)和字符型(char)。这些整数类型的表示以及取值范围如表2-3 所示。,2.2 C#数据类型 2.2.1 值类型 1、整数类型 表2-3中数据类型的变量在赋值时,均可采用十进制或十六
12、进制的数值,但如果是十六进制数值,在书写时要加前缀“0x”(这里“0”是阿拉伯数字“零”,不是字母“o”)。例如: long x=0x12ab; /声明一个整型变量x,并为其赋值为十六进制的数据12AB 在表2-3中,类型指定符用于赋值为常数的情况,指定符放在常数的后面,大小写均可。对使用类型指定符的数据类型,如果在给变量赋常数值时没有使用类型指定符,则默认将int 类型数值隐式地转换为该类型进行赋值。例如: long y=1234; /int型的数值1234隐式地转为long类型。 注意:由于小写的“l”字符容易和数字“1”混淆,所以“L”类型指定符最好用大写。例如: long x=1234
13、L;,2.2 C#数据类型 2.2.1 值类型 2、浮点型 C#语言中有float和double两种浮点类型,具体规定如表2-4所示。,例如: float x=2.3F; /x=2.3 double y=2.7E+23; /y=2.71023,2.2 C#数据类型 2.2.1 值类型 3、小数型 小数型即decimal类型,共占16字节,它所表示的范围大约为1.010-28 7.91028,具有28至29位十进制有效数字,特别适用于金融、货币等需要高精度数值的领域。其类型指定符为M(或m)。例如: decimail myMoney=300.5m; decimal y=9999999999999
14、9999m; decimal x=123.123456789m;,2.2 C#数据类型 2.2.1 值类型 4、布尔型 布尔型用bool表示,bool类型只有两个值:true和false。例如: bool myBool=false; bool b=(i0 注意:C#条件表达式的运算结果必须是bool型。,2.2 C#数据类型 2.2.1 值类型 5、字符型 字符型即char型,为单个Unicode字符,一个Unicode字符的标准长度为两字节。字符型变量可以用单引号引起来的字符直接赋值,例如: char mychar1=A; C#语言中还预定义有一个应用类型的String类,并定义了对应的基本
15、类型string(注意第一个字母是小写)。String类型可以方便地实现字符串的复制、连接等各种操作。注意:string类型的常量用双引号将字符串引起来。例如: string mystr1=”ABCD”; string mystr2=mystr1; 注意:字符类型与字符串类型是两种不同的类型,一定要区分开。,2.2 C#数据类型 2.2.1 值类型 5、字符型 C#语言中还可以使用十六进制的转义符前缀(“x”)或Unicode表示法前缀(“u”)对字符型变量和string类型的变量进行赋值,例如: char mychar2=x0041; /字母“A”的十六进制表示 char mystr3=u0
16、041; /字母“A”的Unicode表示 C#语言中也可以采用转义符来表示一些特殊的字符,包括一些控制字符。表2-5中列出了一些定义字符型数据和字符串类型的数据时常用的转义符。,2.2 C#数据类型 2.2.1 值类型 6、结构型 结构(Struct)是一种复合值类型,它是由一系列相关的、但类型不一定相同的变量组织在一起而构成的,如int、string等。其中每一个变量都是该结构类型的一个成员。结构和类的区别在于:结构是一个值类型(其数据保存在堆栈上),而类是一个引用类型(其数据保存在堆上)。结构中可以包含构造函数、常数、字段、方法、属性、索引、操作符和嵌套类型等。声明struct类型的语法形式为: 附加声明访问修饰符 struct 结构名称:实现的接口 结构体; 表示其中的内容为可选项。,例2-1 声明和使用struct类型数据。,输出结果为: The result is 3,4,ok The result is 1,2, good,2.2 C#数据类型 2.2