第二章 C#程序设计基础_第1页
第二章 C#程序设计基础_第2页
第二章 C#程序设计基础_第3页
第二章 C#程序设计基础_第4页
第二章 C#程序设计基础_第5页
已阅读5页,还剩83页未读 继续免费阅读

付费下载

下载本文档

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

文档简介

Web应用开发基础

ASP.NET(C#)实践教程

邵良杉编著2023/1/311第2章C#程序设计基础了解C#语法特性掌握标识符的定义熟悉常用的关键字掌握变量和常量的使用掌握使用类型系统及装箱和拆箱操作掌握运算符和表达式在控制语句中的应用2023/1/3122.1C#语法概述C#是Microsoft为.NET平台重新精心设计的程序语言,它拥有像VB一样的简易使用性,并同时具备VC++强大功能两种特色;并且删除了许多VC++中比较复杂的功能(例如指针、宏、模板及多重继承等)。C#与C++主要的不同点在于:C#是专门为.NET平台而推出的。C#语言本身并没有类库,直接使用.NETFramework所提供的类型。2023/1/3132.1.1面向对象特性C#是C/C++系列中第一个面向组件的程序语言。近几年来,随着面向组件的程序设计方式已被广泛地应用,并扮演着相当重要的角色。在组件方面,C#最大的改变是组件的设计可以一次完成,同时组件可以在ASP.NET的网页中直接使用。C#另外一个特点就是对面向对象的支持;在C#中每一个东西都是对象。2023/1/3142.1.2稳定和安全特性C#提供给开发者一种稳定及具安全性的编程工具。在它的语法中并没有指针,因此C#的程序也不会有“乱指”的指针这种困扰。自动回收资源结构化的异常处理与类型安全保留现有的资源2023/1/3152.2C#语法基础C#的语法基础知识,主要包括以下内容:标识符和关键字变量常量2023/1/3162.2.1标识符和关键字标识符是程序开发人员为类型、方法、变量等所选择的名称。C#的标识符应当使用字母或下划线开始,由字母、数字、下划线(_)和美元符号($)组成,不能使用空格、标点符号和运算符,而且标识符的名称最好与其作用相关,这样可以使程序更容易理解。2023/1/3172.2.1标识符和关键字C#的标识符不能与关键字相同,可以使用@前缀来避免冲突。C#标识符长度没有限制,避免使用过长的标识符2023/1/3182.2.1标识符和关键字下面列出一些合法的标识符:Same,book,student,_ofnum,sys_1,theXML,ASP_NET,@if,下面列出了一些不合法的标识符:ASP.NET,x>y,Hllo,!xy,#130.doc2023/1/3192.2.1标识符和关键字在C#中也规定了很多关键字用于程序控制,数据说明或者其他功能。由于它们的特殊意义,所以这些关键字不能作为标识符使用,如下表所示。abstracteventnewstructswitchbreaknullobjectthisthrowtryfalsebytecatchcharforfloatPublicuintunsafeusingreadonlyifclassdefaultdoubleisstaticstringvoid2023/1/31102.2.2变量变量用于临时存放数据,变量中的数据随着程序的运行而变化。变量有名字及其数据类型两个属性。变量名用于标识该变量,变量的数据类型确定了该变量存放值的格式及允许的运算。2023/1/31112.2.2变量1、变量定义规则不可以是关键字必须以字母或者下划线开头不可数字开头变量名中间不能包含空格变量名中间不能包含特殊字符变量名不能与C++中的库函数名、类名和对象名相同C#中区分大小写2023/1/31122.2.2变量1、变量定义规则

综上所述:合法的变量名称应该以字母或下划线"_"开始,后面可以跟随一个或多个字母、下划线或数字。要命名一个变量时,可以使用下面的语法: 变量类型

变量名称

[=初始值]2023/1/31132.2.2变量变量命名示例:int0xyz;int_xyz;(合法)int_0xyz;(合法)int#xyz;intxyz_0;(合法)2023/1/31142.2.2变量2、初始化变量变量在使用之前必须赋给它一个值。可以通过使用赋值语句来给变量赋值,另一种方法就是还可以在命名变量的语句中初始化这个变量,例如:Stringstr="World";注意:值必须与指定的变量类型兼容。2023/1/31152.2.2变量3、命名约定在命名变量和常量时,必须遵守C#的定义规则,此外,还必须遵守一些命名约定;所有标识符的含义和用法总是应该非常清晰的。标识符必须是有意义的。标识符前放置前缀,以表明其数据类型将名称前缀之后的每个单词的首字母大写。对变量使用混合大小写,对常量使用大写2023/1/31162.2.2变量数据类型前缀说明示例Booleanbln布尔类型blnLogin(是否登录成功)DateTimedat日期和时间datBirthday(出生日期)Decimaldec小数类型decHoursWorked(工作时间)Doubledbl双精度浮点数dblPI(圆周率)Intint整数类型intQuantity(数量)Longlng长整数类型lngPopulation(人口)Floatflt单精度浮点数fltPayRate(工资率)Stringstr字符串类型strPhoneNumber(电话号码)下表中列出了最常用的数据类型及其前缀的列表。2023/1/31172.2.2变量4、变量类型在C#中把变量分为7种类型:静态变量:带static修饰符非静态变量:不带static修饰符数组元素值参数引用参数输出参数局部变量:在独立程序段中定义的变量2023/1/31182.2.2变量下面的例子说明了各个变量的不同类型:

classDemo{ publicstaticint

intTmpX;

int

intTmpY; voidCalculate(int[]intAry,int

intVpara,refint

intRefpara,outint

intOutpara){

int

intNum=1;

intOutpara=intVpara+intRefpara++;}}2023/1/31192.2.3常量常量提供了一种使用单词名称来描述一个不能更改的值的方法。例如,在VisualStudio中就有像Color.Blue、Color.Red和Color.White等等一些常量。这些常量都是由内置在环境中的,因此我们也称为“内部变量”,不需要在任何位置命名它们。自定义的常量称为“命名常量”。2023/1/31202.2.3常量1、命名常量的方法可以使用关键字const来声明命名常量,再为常量指定名称、数据类型和值。如果将一个值声明为常量之后,就不能在执行项目的过程中对它的值进行更改,而且声明的数据类型必须与这个值的数据类型是一致的。命名常量的一般方法如下:const数据类型常量名称

=值;2023/1/31212.2.3常量常量的命名约定需要一个前缀和数据类型子句,常量名称全部使用大写字母,并且使用下划线将各个单词分开。例子:constStringstrCOMPANY_NAME=“wyuUniversity”;2023/1/31222.2.3常量2、给常量赋值向常量赋值时必须遵守类似变量的规则。我们知道,字符串(文本值)必须包含在引号中,数字值不需要包含在引号中。数字常量只能包含数字和小数点,不能包含特殊字符。如果没有附加类型声明,则任何整数均被视为int类型,任何小数将被视为double类型2023/1/31232.2.3常量字符串常量可以包含字母、数字和特殊字符,因为字符需要包含在引号中,因此需要在引号前添加反斜杠“\”,表示按照原样使用后面的字符。例如:“有声图文”动之美”转换为字符串常量是:“有声图文\”动之美\”;字符串被称为“文本串”,是因为它们精确地包含了引号内所有的内容。2023/1/31242.2.3常量3、内部常量内部常量指的是系统定义的常量。在系统类库中声明了很多组内部常量,可以在C#程序中使用它们。在使用内部常量时,必须指定类型名称或组名称以及常量名称。例如:Color.Red是Color类中的Red常量。2023/1/31252.3C#类型系统C#本身没有自带类库,使用由.NETFramework提供的公共类型系统,这个系统提供了三个主要功能:为跨语言集成、类型安全和高性能代码提供了一个架构。提供一个面向对象模型来支持多种编程语言的完整实现。定义语言所要遵循的规则,这样保证了用不同语言编写的对象可以交互。公共类型系统分成两种类型:值类型和引用类型。2023/1/31262.3.1值类型1、在值类型中直接包含了数据,它是放置在运行库堆栈中的。2、值类型通常用来表示基本的类型,例如:整数类型、布尔类型、实数类型、字符类型、枚举类型,也可以是用户使用struct关键字定义的类型。2023/1/31272.3.1值类型类别类名称说明C#数据类型整数类型Byte8位无符号整数类型ByteSbyte8位有符号整数类型*SbyteInt1616位有符号整数类型Int16Int3232位有符号整数类型Int32Int6464位有符号整数类型Int64Uint1616位无符号整数类型*Uint16Uint3232位无符号整数类型*Uint32Uint6464位无符号整数类型*Uint64浮点类型Single32位单精度浮点数类型SingleDouble64位双精度浮点数类型Double逻辑类型Booleantrue或者false布尔值Boolean其他类型Char16位Unicode字符CharDecimal96位十进制数类型DecimalIntptr根据平台确定其大小的有符号整型数类型IntptrUintptr根据平台确定其大小的无符号整型数类型Uintptr2023/1/31281、整数类型数据类型说明.NETFramework类型数值范围sbyte有符号8位整数System.SByte-128~127byte无符号8位整数System.Byte0~255short有符号16位整数System.Int16-32768~32767ushort无符号16位整数System.UInt160~65535int有符号32位整数System.Int32-2147483648~2147483647uint无符号32位整数System.UInt320~4294967295long有符号64位整数System.Int64-9223372036854775808~9223372036854775807ulong无符号64位整数System.Uint640~184467440737095546152023/1/31292、布尔类型布尔类型的取值范围只有true和false两种,用户可以直接将一个布尔变量设置为true或者false。例如:bool

blCheck=true;bool

blReadOnly=false; 也可以将一个表达式赋值给布尔变量,例如bool

blTest=(intScore>0&&intScore<101)//只有intScore在1至100时blTest的值才为true 2023/1/31302、布尔类型在使用布尔类型的值时,需要注意true并不像C/C++中表示的非零的值,而且在C#的表达式中,若要使用布尔类型判断时,必须指定使用bool类型变量。

int

intScore if(intScore) if(intScore==100) if(intScore!=0)2023/1/31313、实数类型C#中使用两种数据类型来表示小数:单精度和双精度,两者的差异取决于取值范围和精度。下表列出了单精度、双精度和十进制类型的表示数的精度。数据类型说明.NETFramework类型精度Float存储32位浮点值System.Single7位Double存储64位浮点值System.Double15~16位Decimal128位数据System.Decimal28~29位有效位2023/1/31323、实数类型注意:由于小数的运算速度远远低于整数的运算速度,因此,在精度要求不高的前提下,应采用单精度类型,而对于精度要求较高的运算,应该采用双精度类型。2023/1/31334、字符类型字符类型(char)用于表示一个Unicode字符,Unicode字符使用16位字节表示,可以表示世界上绝大多数的字符,例如:charch='中';需要注意的是,在C#中没有隐式转换;如果字符要用整数表示,必须使用显式的类型转换,例如:charch=(char)64;2023/1/31344、字符类型以“\”开头的为转义字符,它用于在程序中取代特殊的控制字符。下表显示了各个转义字符的含义。转义字符含义转义字符含义\n换行\f换页\t水平制表符\\反斜杠字符"\"\v垂直制表符\'单引号'\b退格\"双引号"\r回车\0空字符\a感叹号"!"例:charch=‘\’’(书本印刷有误);2023/1/31355、结构类型使用上述介绍的这些简单数据类型,可以完成一些数据运算、字符运算的基本工作。但是,只使用这些数据类型是远远不够的,有时还需要将不同类型的数据组合成一个单一的实体。在C#中,我们可使用结构数据类型。2023/1/31365、结构类型定义结构的代码如下:structEmployee{ publicint

intID; //员工编号 publicStringstrName; //姓名 publiccharchSex; //性别 publicStringstrBirthday; //出生日期 publicstringstrAddress; //住址};2023/1/31375、结构类型上述代码只是一种用户自定义的数据类型,不包含具体的数据,系统也不会为其分配内存。如果要使用结构类型数据,还需要定义该结构类型变量,并在其中存放具体的数据,例如:

EmployeestrEmp;strEID=100;

strEmp.strName=“小明”;注意:struct是属于值类型,而class是引用类型;struct类型不能被继承,class类型可以被继承。2023/1/31386、枚举类型在编程程序时,有时会有到由若干个有限数据元素组成的集合,例如一年的从1到12月的集合,一个星期的星期一至星期日7个数据元素组成的集合;由3种颜色红、黄、绿组成的集合等等。程序中某个变量取值仅限于集合中的元素,此时便可将这些数据集合定义为枚举类型(enum)。2023/1/31396、枚举类型枚举类型的定义形式一般为:

enum

枚举名 {枚举值表

}; 例如:

enumColors { White,Black,Red,Yellow,Pink,};2023/1/31406、枚举类型上述代码创建了Colors的枚举类型,当命名了Colors类型变量oneColor后,其取值只能是其中一种。ColorsoneColor;oneColoe=Colors.Red;系统默认的枚举类型中,枚举元素都是int类型,而且第一个枚举元素值为0,后面每一个递增1,除默认情况下,可以为枚举元素直接赋值,其赋值类型只能是long、int、short、byte等整数类型。2023/1/31412.3.2引用类型所谓引用类型,其含义是该类型的变量不直接存储所包含的值,而是指向它所要存储的值。和值类型相比,引用类型不存储它们所代表的实际数据,而它们存储的是实际数据的引用(即地址)。422023/1/31422.3.2引用类型2023/1/31432.3.2引用类型C#提供的引用类型有: 1、对象类型 2、类类型 3、字符串类型 4、数组类型 5、接口类型 6、委托类型2023/1/31442.3.2引用类型1、对象类型任何类型都继承自system.object,所以任何类型都具备system.object所提供的功能。例:int

intx=520;stringstrX=intx.Tostring();其中ToString()就是system.object的一个公开成员。2023/1/31452.3.2引用类型2、类类型类是C#中最重要、功能最完整的类型,也是通常用来提供功能给外部合用的基本单位。在C#中,使用类来实现面向对象的数据隐藏及封装的特性。 2023/1/31462.3.2引用类型publicclassabc{privateintID=0;

publicstringName=null;publicstringab(){return

ID.ToString()+Name.ToString();}}2023/1/31472.3.2引用类型3、字符串类型可以对字符串进行各种操作和处理,直接派生于object类。例: //定义、赋值

stringstrmsg="ASP.NET2.0"; //合并字符串

stringstrmsg="ASP.NET2.0"+"VS2005";

//访问单个字符

charA=strmsg[0].ToString();

2023/1/31482.3.2引用类型4、数组类型存储整数对象、字符串对象或者其他任何的对象类型,数组中的元素必须是同一类型。string[]arrays={"Red","blue","yellow"};arrays[0]="Red";arrays[1]="blue";arrays[2]="yellow";int[,]arrlist={{1,2},{3,6}};arrlist[0][0]=1;arrlist[0][1]=2;arrlist[1][0]=3;arrlist[1][1]=6;2023/1/31492.3.2引用类型4、数组类型命名时不初始化数组:string[]anycolor=newstring[3];int[,]arrlis=newint[3,2];动态生成数组:Int

intar=3;Intarray=newint[intar];2023/1/31502.3.2引用类型5、接口类型接口表示功能类似的函数定义,但里面的函数没有实现的代码,我们不能创建接口实例,只有继承此接口的类才可以创建实例。例:

interfaceinterfa

{

intstr(inta,intb);

voidsrt();

}2023/1/31512.3.2引用类型6、委托类型委托类型其实就是面向对象的函数指针。它是一个封装了特定函数签名(参数的个数、类型、顺序等)的函数。例:delegatestringadd();2023/1/31522.3.3装箱和拆箱装箱是将值类型转换为引用类型,拆箱是将引用类型转换为值类型。利用装箱和拆箱功能,可通过允许值类型的任何值与Object类型的值相互转换,将值类型与引用类型链接起来。2023/1/31532.3.3装箱和拆箱1、装箱的过程是指隐式的把任何值类型转换为引用类型的过程,当一个值类型被装箱后,一个对象实例就被分配,且值类型的值被复制给新的对象。例:

int

intar=10;objectobjtar=intar

;2023/1/31542.3.3装箱和拆箱2、拆箱为装箱的逆过程,在装箱过程不需要显示的类型转换,但在拆箱过程就必须进行。例:

int

intar=10;

objectobjvar=intar;

int

intobj=(int)objvar;2023/1/31552.4运算符和表达式运算符指明了进行运算的类型,例如加、减、乘和除法等等运算类型。使用运算符将常量、变量、函数连接起来便构成了表达式。C#中的运算符和表达式继承了C语言的功能,从而使开发人员能够很快的从C转移到C#语言开发中来,本节我们将介绍C#运算符的使用和表达式的语法。2023/1/31562.4.1使用C#运算符算术运算符逻辑运算符递增运算符递减运算符2023/1/3157C#中的所有的运算符运算符类型运算符算术运算符+(加)-(减)*(乘)/(除)%(取模)逻辑运算符&(按位与)|(按位或)^(按位异或)!(逻辑非)~(按位补)&&(逻辑与)||(逻辑或)递增、递减++(前缀/后缀增量)--(前缀/后缀减量)移位运算符<<(二进制左移)>>(二进制右移)关系运算符==(等于)!=(不等于)<(小于)>(大于)<=(小于等于)>=(大于等于)赋值运算符=(赋值)+=(加法赋值)-=(减法赋值)*=(乘法赋值)/=(除法赋值)%=(取模赋值)&=(按位与赋值)|=(按位或赋值)<<=(左移赋值)>>=(右移赋值)成员访问.(成员访问运算符)不可重载2023/1/3158C#中的所有的运算符运算符类型运算符索引运算符[](索引运算符)不可重载,但可以定义索引器转换运算符()(强制转换运算符)不可重载,但可以定义转换运算符条件运算符?:(三元IF语句)不可重载创建对象new(创建对象的一个实例)不可重载类型信息as(安全转换为指定类型)is(用于检查给定类型是否为指定类型)不可重载溢出checked(控制溢出检查上下文)unchecked(控制溢出检查上下文)不可重载间接寻址和地址*(指针取消引用)->(指针成员访问)[](指针索引)&(取地址

)不可重载2023/1/31592.4.2常规运算符操作常规的运算符包括算术、递增、递增、关系和赋值运算符,使用它们完成一些基本的程序逻辑。

intx=10;if(++x==11){Response.Write("x被递增后执行表达式,此句将被执行");}if(x++==12){Response.Write("x先比较后递增,此句不执行");}2023/1/31602.4.3三元运算符运算符?:是if/else语句的一个简化形式,因其在使用时需要3个操作数,也被称作三元运算符。但是,过多的使用三元运算符会造成代码过于简短,所以应该只在需要非常简单的表达式时才使用。三元运算符的语法如下:result=<expression>?<statement1>:<statement2>;例:intmoney=intcount>100?10:52023/1/31612.4.4checked和unchecked运算符当对整数类型执行操作,而其值超出该数据类型的范围时,checked和unchecked运算符可以指定CLR如何处理堆栈溢出。例如,考虑下面的代码: byteb=255; b++;

Console.WriteLine(b.ToString());2023/1/31622.4.5is、sizeof和typeof运算符is运算符可以用于动态地检查运行时两个对象类型是否和引用的对象类型相同,它不执行值比较,如果两个对象类型都引用同一个对象类型,则结果为true,反之则为false。

doubledblPrice=100.01; if(dblPriceisobject){ //C#中任何东西都是对象,比较结果为true

Console.WriteLine("dblPrice是一个对象");}2023/1/31632.4.5is、sizeof和typeof运算符sizeof运算符可以确定堆栈中值类型需要的长度(字节)unsafe{Console.WriteLine(sizeof(double));}2023/1/31642.4.5is、sizeof和typeof运算符typeof

运算符返回一个表示特定类型的值对象。typeof(int) typeof(string)typeof(S32) typeof(double)int32 string int32 double2023/1/31652.4.6运算符优先级在实际编写程序代码时,有时一个表达式中包含多个运算符,这时就必须给出表达式中各个运算符的运算顺序(即优先级),下表从高到低列出了C#中运算符的优先级别。2023/1/31662.4.6运算符优先级类

别运算符元运算符()x.y

f(x)a[x]x++x--newtypeof

sizeofcheckedunchecked一元运算符+-|~++x–x(T)x乘除运算符*/%加减运算符+-位移运算符<<>>关系运算符<><=>=is等于运算符==逻辑与&逻辑异或^逻辑或|条件与&&条件或||条件运算符?:赋值运算符=*=/=+=-=<<=>>=&=^=|=2023/1/31672.5控制语句没有控制语句,一个应用程序就完全无法运行。在本节中将介绍用C#编写的程序如何执行代码、以怎样的顺序执行、以及如何通过循环、条件等语句来改变代码的流程。C#中的控制语句包括:条件语句(if和switch语句)、循环语句(while、for和do语句)跳转语句(goto、break和continue语句)2023/1/31682.5.1条件语句条件语句是逻辑选择的核心。通过条件语句可以实现一些业务逻辑。C#提供了多种方法来实现逻辑。注意:C#要求条件条件表达式为布尔运算,即计算值为真或为假。而C或C++中则没这么严格,表达式的值只要为0或者非0就可以决定处理流程。2023/1/3169IF条件语句IF条件语句一个If语句计算一个布尔表达式的值,并由此决定是否执行一条或者一组语句,在默认情况下,if语句控制着下方紧跟的一条语句的执行。if语句的扩展形式是if/else组合,使if语句可以控制多个代码块。2023/1/3170IF条件语句1、控制单个语句:If(布尔表达式) 代码1;或者:If(布尔表达式) 代码1;代码2;代码3;2023/1/3171IF条件语句2、if条件语句扩展:If(布尔代码表达式) {代码块1;}Else {代码块2;}2023/1/3172IF条件语句3、多重嵌套If(布尔表达式){代码块;}Else{if(布尔表达式){代码块;} else{If(布尔表达式){代码块} else{}}…………}2023/1/3173Switch条件语句Switch语句的语法如下:switch(表达式){case值1;语句1;break; case值2;语句2;break

……default:

语句;break;}Case表达式的值必须是常量型的,不可以是方法调用的结果,或者是一个值会变化的变量表达式可以是整形的、字符型、字符串型、或者枚举值非必须的2023/1/31742.5.1条件语句使用SWITCH条件语句注意事项:包含语句的每个case语句体中必须包含break语句,default语句也一样。只有当case结构为空时,才会导致case语句失败要实现case语句间的跳转,可以使用goto语句case语句中可以是有效的C#语句,包含方法调用和返回语句。任何2个case子句不能相同,包括值相同的不同常量。2023/1/3175多个case条件执行一样的语句

switch(types){

case"jpg":

case"gif":

case"png":Response.Write("图像文件");break;case"doc":

case"xls":

case"ppt":Response.Write("office文档");break;

}2023/1/31762.5.2循环语句使用循环能够多次执行同一个任务,直到完成另一个比较大的任务。这是在开发中经常用到的技术。1、for循环 for(initializer;condition;iterator); statement;

或者:for(initializer;condition;iterator); {statements;}2023/1/31772.5.2循环语句

int[]arr={10,20,30,40,50,60,70,80,90};intlen=arr.Length;intsum=0;for(inti=0;i<len;i++){sum=sum+arr[i];}returnsum;2023/1/3178其他形式的for循环for(;intmonth>0;intmonth--

温馨提示

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

最新文档

评论

0/150

提交评论