1、,第2章 C#程序设计基础,内容摘要,C#一种全新的简单、安全、面向对象的程序设计语言,是专门为.NET的应用而开发的语言。C#语言从C和C+演变而来,尽管借鉴了C和C+的许多东西,但是在一些诸如名字空间、类、方法和异常处理等特定领域之间还存在着巨大的差异。C#提供了方便的功能,如垃圾收集、类型安全、版本控制,等等。本章通过对数据类型、运算符、表达式、结构、枚举及面向对象等语法进行讲解,使读者掌握C#程序的基础内容。,学习目标,掌握c#数据类型 了解常量与变量 掌握运算符和表达式的运用 了解数组的使用 熟悉掌握各种流程控制语句 了解C#面向对象的基本概念,2.1 C#入门语法,编程语言都要处理
2、数据,而数据类型又不相同,要想使计算机了解这些数据,必须让程序语言描述出各种数据的类型和处理方法,本节主要介绍C#的基本语法,包括C#的数据类型、运算符。,2.1.2 数据类型,在程序设计中,数据是程序的必要组成部分,是程序处理的对象。不同的数据有不同的数据类型,不同的数据类型有不同的数据结构和存储方式,并且参与的运算也不同。C#的数据类型采用了类似于C和C+语言的数据类型表示形式,但又有所改进。C#将所有的数据类型分为两大类:值类型和引用类型。,2.1.2 数据类型,1值类型值类型通常用来表示基本类型。如整型、实型、布尔型等基本数据类型都是值类型。C#的值类型主要包括:整数类型、布尔类型、实
3、数类型、字符类型、结构和枚举类型。,2.1.2 数据类型,整数类型C#定义了8种整数类型。这种8种整数类型数据在内存中占用的内存位数各不相同。 布尔类型布尔类型用来表示“真”和“假”的数据类型,对应的.NET Framework类型为:System.Boolean。在C#中布尔类型值只有两个:true和false,这与C/C+不同。在C/C+语言中,0可以表示为“假”,任何非0值都表示为“真”。 实数类型实数又称为浮点数。实数数据有两种表示形式:单精度(float)和双精度(double)。这两者之间主要的区别是取值范围和精度不同。,2.1.2 数据类型,字符类型C#提供了字符(char)来处
4、理ASCII字符和Unicode编码的字符。char对应的.NET Framework类型为System.Char。char类型数据一般用单引号括起来。,2.1.2 数据类型,结构类型在实际生活中,经常把一组相关的信息放在一起。记录一本书的相关信息如书名、作者和内容等。如果按照简单的管理,每一条记录都要放到三个不同的变量中,这样的工作量很大,也不够直观。C#结构体可以解决这个问题。把一系列相关的变量组织成为一个单一实体的过程,称为生成结构的过程。这个单一实体的类型就叫做结构类型,每一个变量称为结构的成员。结构类型的变量采用struct来进行声明。struct 类型名称/主体,2.1.2 数据类
5、型,枚举类型枚举是值类型的一种特殊形式,为简单类型的常数值提供一种方便记忆的方法。枚举类型的定义形式一般为:enum 枚举名 枚举值表;,2.1.2 数据类型,2引用类型引用类型与值类型相比,引用类型不存储实际数据,而存储实际数据的引用(即地址)。具体情况就是,当将一个数值保存到一个值类型变量后,该数值实际上复制到变量中;而把一个值赋值给一个引用类型时,仅是引用(保存数值的变量地址)被复制,而实际的值仍然保留在相同的内存位置。C#提供的引用类型有:类类型、字符串类型、数组、接口类型和委托类型,这些会在后面的章节进行详细介绍。,2.1.2 变量和常量,无论编写任何应用程序,数据都必须以某种方式表
6、示。变量和常量在编写应用程序时经常用到,变量和常量的使用让代码更具有可读性、更容易维护。,2.1.2 变量和常量,1声明常量常量以const关键字声明,后面紧跟数据类型和赋值语句。常量的定义语法如下所示:const 数据类型 变量名= 一个固定的值;常量的命名规则:带有私有访问的常量必须以骆驼命名发声明,并以一个下划线开头。带有共有修饰符,首保护修饰符的常量必须以帕斯卡命名法声明。,2.1.2 变量和常量,2声明变量变量名一般都是小写字母,如果变量名比较长,可以第二个单词首字母大写。变量按如下的方式声明:访问修饰符 数据类型 变量名称;,2.1.3 表达式和运算符,运算符是一个术语或者符号,可
7、以接受一个或者多个表达式(即操作数)作为输入并返回值。C#提供了大量的运算符,这些运算符是指定在表达式中执行哪些操作的符号。通常允许对枚举进行整型运算,例如=、!=、=。表达式是由一个或者多个操作数以及零个或者零个以上的运算符所组成的序列。可以通过计算得到一个值、对象、方法或者命名空间等结果。表达式可以包含文本值、运算符、方法调用及操作数,或者简单名称。简单名称可以是变量、方法参数、类型成员、命名空间或者类型的名称。,2.1.3 表达式和运算符,1运算符的分类运算符就像数学运算中用到的各种符号,起到操纵各种变量的信息,用于执行加法、减法等运算。根据运算符的作用,运算符大致可以分为赋值运算符、算
8、术运算符、关系运算符、条件运算符、符合运算符和其他运算符6类。,2.1.3 表达式和运算符,赋值运算符赋值运算符(=)将右操作数的值存储在左操作数表示的存储位置、属性或者索引器中,并将值作为结果返回。操作数的类型必须相同(或者右边的操作数必须可以隐式转换为左边操作数的类型)。 算术运算符算术运算符用于整型或者浮点型数据,完成算术运算。 关系运算符关系运算符(relational operators)决定值和值之间的关系。,2.1.3 表达式和运算符,条件运算符C#中使用条件运算符(?:),使程序更简洁地表达那些简单的if-else结构。条件运算符是惟一的三目运算符,条件运算符(?:)根据布尔型
9、表达式的值返回两个值中的一个。其使用格式如下:(条件表达式)?(条件为真时的表达式):(条件为假时的表达式) 复合运算符复合运算符实际上是一种缩写形式,使得对变量的改变更为简洁。复合运算的一般形式为:变量 符合赋值运算符 表达式 其他运算符除了上述的运算符之外,还有标点运算符、sizeof运算符、类运算符、new运算符等。,2.1.3 表达式和运算符,2运算符的优先级,2.1.3 表达式和运算符,3表达式表达式(expression)由操作数(operand)和运算符(operator)构成,可以通过运算产生一个结果或者完成某种操作,如果为变量赋值。可以在计算窗口、对话框、文本对象等所有使用函
10、数与变量的地方使用表达式。表达式由函数、变量、运算符、数字、字母、字符串、常数以及为其加注释组成,也可以理解为是由一个或者多个运算符连接多个变量而形成的语句。,2.1.4 简单类型转换,装箱和拆箱是C#类型系统的核心概念。通过允许一个值类型转换为引用类型或者从一个引用类型转换成值类型,这种机制形成了值类型和引用类型之间等价连接。即任何数据都可以被看作对象。,2.1.4 简单类型转换,1装箱转换装箱转换是指一个值类型隐式地转换成一个object类型,或者把这个值类型转换成一个被该值类型应用的接口类型(interface-type)把一个值类型装箱,也就是创建一个object实例并将这个值复制给这
11、个object。,2.1.4 简单类型转换,2拆箱转换和装箱转换正好相反,拆箱转换是指将一个对象类型显示地转换成一个指类型,或者是将一个接口类型显式地转换成一个执行该接口的值类型。拆箱的过程分为两步:首先,检查这个对象实例,看其是否为给定的值类型的装箱值。然后,把这个实例的值拷贝给值类型的变量。,2.2 数组,数组是相同类型对象的集合。数组实际上可以是任意长度,这意味着可用于存储数千乃至数百万个对象,但其大小必须在创建数组时就确定下来。数组中的每一项都由一个索引来访问,索引只是一个指示对象在数组中的存储位置或者槽的数字。数组既可用于存储引用类型,也可用于存储值类型。数组根据存储数据的形势可分为
12、一维数组和多维数据,数组是一个经过索引的对象集合。一维数组结构相对比较简单,以线性方式存储了固定数目的项,仅仅需要一个索引值就可以确定任何一项。,2.2 数组,在C#中,数组声明中的方括号必须紧跟数据类型。因此,可以使用下面的语法来声明整数类型的数组:int MyArray;一旦声明了数组,就可以使用New关键字来设置其大小:int MyArray;/声明数组MyArray=new int10;/设置他包含10个int对象的大小,2.3 控制语句,控制语句用于控制程序的流程,以实现程序的各种结构方法。由特定的语句定义符组成。C#有9种控制语句,可以分成三类选择语句、循环语句和跳转语句。条件语句
13、 包括if语句和switch语句。循环语句 包括do while语句、while语句和for语句。跳转语句 包括break语句、goto语句(此语句尽量少用,因为他不利于结构化程序设计,过多的使用会使程序流程无规律、可读性差)、continue语句和return语句。,2.3.1 条件语句,条件语句又称为选择语句,判断一个表达式的结果真假(是否满足条件)。根据结果判断执行哪个语句块。选择语句分为if语句和switch语句两种。1if语句在C#语法中,选择语句的语法如下(if和else是关键字):if(表达式) /代码片段1else /代码片段2如果表达式的值为true,则运行代码片段1,否则运
14、行代码片段2。以下if语句用于求一个数的绝对值。如果num的值大于0,就重置设置变量result获取num的值,否则就获取num对应的正数值。,2.3.1 条件语句,2switch语句在设计多路分支程序时,可以选择之前讲到使用.else if语句。但对于分支非常多的情况下,使用这些语句写成的代码可读性不高,执行效果也偏低,switch语句的出现解决了这一难题,并为设计多路分支程序带来了便利。switch语句提供了一个多路分支,因此可以使程序在多个选项中进行选择。尽管一系列的if语句或者if/else语句嵌套可以实现多路分支,但在大多数情况下使用switch语句更为高效,并且写出的代码思路清晰、
15、易读。,2.3.1 条件语句,使用switch语句的基本语法形式如下所示。switch(表达式)case 常量1:语句;break;case 常量2:语句;break;default:语句;break;,2.3.1 条件语句,switch语句工作时,首先把后面的表达式或者变量表达式与每个case匹配的常量进行比较,如果表达式与常量相匹配则执行该语句;如果与每个常量都没有匹配则执行default中的代码。C#中switch中每个部分必需都有break语句,因为在执行完第一个case后,再执行第二个case语句非法。并且switch语句后面括号中表达式的值只能是整型、字符型或者枚举型表达式。,2.3.2 循环语句,循环语句也称为迭代语句,让程序重复执行某个程序块,直到某个特定的条件表达式结果为假时,结束执行语句块。C#提供了以下几种可以让程序循环执行的语句。,2.3.2 循环语句,1for循环for语句是一种在程序执行前就要首先判断条件表达式是否为真的循环语句。如果循环条件为假,那么循环语句根本就不会去执行。for循环适合用于一个语句或者语句块重复执行预定的次数。for语句通常使用在知道要循环次数的循环中。语法如下:for(初始值表达式;循环条件表达式;循环后的操作表达式)执行语句块,