




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第3章C#程序设计基础
3.1标识符3.2C#中数据类型3.3C#中的变量和常量3.4类型转换
3.5结构类型和枚举类型3.6C#运算符和表达式3.7C#中常用类和结构3.1标识符C#的标识符名称必须遵守以下规则:(1)所有的标识符只能由字母、数字和下划线这3类字符组成,且第一个字符必须为字母或下划线。(2)标识符中不能包含空格、标点符号、运算符等其他符号。(3)标识符严格区分大小写。(4)标识符不能与C#关键字名相同。(5)标识符不能与C#中的类库名相同。a12_c√1abc3.2C#中数据类型C#中数据类型分类3.2.1值类型值类型的变量内含变量值本身,C#的值类型可以分为简单类型、结构类型和枚举类型。下面仅介绍简单类型。1.整数类型2.实数类型3字符类型例如,可以采用如下方式字符变量赋值:
charc='H'; //字符Hcharc='\x0048'; //字符H,十六进制转义符(前缀为\x)charc='\u0048'; //字符H,Unicode表示形式(前缀为\u)charc=‘\r’; //回车,转义字符在表示一个字符常数时,单引号内的有效字符数量必须且只能是一个,而且不能是单引号或者反斜杠(\)。4.布尔类型布尔类型数据用于表示逻辑真和逻辑假,布尔类型的类型标识符是bool。注意:在C#语言中,bool类型不能像C++语言那样可能直接转换为int类型,例如,inta=(2<3);在C/C++中都是正确的,但在C#中不允许这样,会出现“无法将类型bool隐式转换为int”的编译错误。3.2.2引用类型引用类型也称为参考类型。和值类型相比,引用类型的变量不直接存储所包含的值,而是指向它所要存储的值。类似C中的指针。1.object类object是C#中所有类型(包括所有的值类型和引用类型)的基类,C#中的所有类型都直接或间接地从object类中继承而来。因此,对一个object的变量可以赋予任何类型的值。
floatf=1.23;objectobj1; //定义obj1对象obj1=f;objectobj2="China"; //定义obj2对象并赋初值2.string类C#还定义了一个string类,表示一个Unicode字符序列,专门用于对字符串的操作。同样,这个类也是在.NETFramework的命名空间System中定义的,是类System.String的别名。字符串在实际中应用非常广泛,利用string类中封装的各种内部操作,可以很容易完成对字符串处理。例如:
stringstr1="123"+"abc";//"+"运算符用于连接字符串charc="HelloWorld!"[2];//"[]"运算符可以访问string中的单个字符,c='e'stringstr2="China";stringstr3=@"China";//字符串的另一种表示形式,用@引起来。boolb=(str2==str3); //"=="运算符用于两个字符串比较,b=true3.3C#中的变量和常量3.3.1变量1.变量定义在C#程序里使用某个变量之前,必须要告诉编译器它是一个什么样的变量,因此要对变量进行定义。定义变量的方法如下:
[访问修饰符]数据类型变量名[=初始值];例如:
stringname="王华";intage=20;也可以同时声明一个或多个给定类型的变量,例如:
inta=1,b=2,c=3;定义一个变量,系统就会在内存中开辟相应大小的空间来存放数据。可以从下面4个层面来理解变量。变量名称变量的值变量的数据类型变量的作用域3.3.2值类型变量和引用类型变量的区别程序的内存空间分为栈空间和堆空间,值类型的数据在栈空间中分配,而引用类型数据(对象)在堆空间中分配。程序的执行空间:栈空间堆空间1.理解值类型的变量C#中的值类型变量和C/C++语言中的普通变量(非指针变量)相似,这类变量直接包含它们的值。C#中在内存的栈空间中为值类型变量分配空间,而且没有单独的堆分配或垃圾回收开销。因此值类型变量会随着方法调用后栈空间的消亡而自动清除(C#中的值类型变量像C/C++语言中函数内的局部变量,函数执行完后由系统释放其存储空间)。例如:intx;inty=2;x=y;2.理解引用类型的变量在C/C++语言中可以定义指针变量,例如:
char*p;其中,p是一个指针变量,其中存放某个字符变量的地址,注意变量p和它所指向的字符变量是两个不同的东西。在C#中没有指针,而改为引用,引用表示某个对象的地址而不是变量或对象本身。C#中引用类型变量和其所指的对象的关系,如同前面C/C++语言中的变量p和它所指向的字符变量的关系。在C#中,无论值类型变量还是引用类型变量,都是在栈空间中分配对应的存储空间,所不同的是,引用类型变量所指向的对象是在托管堆上分配内存空间的,为什么这样呢?先看一个简单的C/C++语言函数:voidfun(){ char*p; //定义指针变量p inti; //定义整型变量i p=(char*)malloc(10*sizeof(char));//为p分配10个字符的空间 for(i=0;i<10;i++) //为10个字符单元分别赋值'a'~'j'
*(p+i)='a'+i; printf("%s\n",p); //输出:abcdefghij
}该函数被调用后,其中局部变量p和i的空间被回收,但p所指向的10字符空间并没有被回收,即便程序执行结束,该空间仍然没有回收。这样可能出现内存泄漏问题。解决的方法是在上述函数的末尾加上free(p)语句回收p所指向的内存空间。.NETFramework改进了这一点:将C#应用程序的执行置于CLR的监控之下,而且所有引用类型变量所指向的对象(其生命周期是全局性的)都在托管堆上分配空间,程序执行完毕,由CLR将堆空间全部回收,这样就不会出现像前面C/C++程序出现的内存泄漏问题了。所以在C#中,当定义一个引用类型变量时,系统在栈空间中为该引用变量分配存储空间,要想创建对象并把对象的存储地址赋给该变量,就需要使用new操作符。例如:MyClassvar; //MyClass是已定义的类或类型var=newMyClass(); //创建var引用的实例第2个语句使用new操作符来创建对象,C#会在堆存储空间中为这个对象分配足够的空间来存放MyClass类的一个实例,然后把这个实例的地址赋给这个引用类型变量var,如图3.5所示。以后就可以通过这个引用类型变量var来操作堆中创建的那个对象了。图3.5引用类型变量及其所指对象3.3.3常量1.直接常量直接常量是指把程序中不变的量直接硬编码为数值或字符串值,例如,以下都是直接常量:
100 //整型直接常量1.23e5 //浮点型直接常量2.符号常量符号常量是通过关键字const声明的常量,包括常量的名称和它的值。常量声明的格式如下:
const数据类型常量名=初始值;其中,“常量名”必须是C#的合法标识符,在程序中通过常量名来访问该常量。“类型标识符”指示了所定义的常量的数据类型,而“初始值”是所定义的常量的值。例如:
constdoublePI=3.14159265;3.4类型转换值类型之间的转换有隐式转换和显式转换。另外装箱和拆箱也属于一种类型转换。3.4.1隐式转换隐式转换是系统默认的、不需要加以声明就可以进行的转换。3.4.2显式转换显式转换又叫强制类型转换,与隐式转换相反,显式转换需要用户明确地指定转换类型,一般在不存在该类型的隐式转换时才使用。格式如下:
(类型标识符)表达式其作用是将“表达式”值的类型转换为“类型标识符”的类型。例如:
(int)1.23//把double类型的1.23转换成int类型,结果为1
需要提醒注意以下几点:(1)显式转换可能会导致错误。进行这种转换时编译器将对转换进行溢出检测。如果有溢出说明转换失败,就表明源类型不是一个合法的目标类型,转换就无法进行。(2)对于从float、double、decimal到整型数据的转换,将通过舍入得到最接近的整型值,如果这个整型值超出目标类型的范围,则出现转换异常。【例3.1】设计一个控制台程序说明类型转换的应用。usingSystem;namespaceProj3_1{classProgram{staticvoidMain(string[]args){inti=65,i1,i2; doubled=66.3456,d1,d2; charc='A',c1,c2; Console.WriteLine("i={0:d5},d={1:f},c={2}",i,d,c); i1=(int)d; //强制类型转换 d1=i;//隐式类型转换 c1=(char)i; //强制类型转换 Console.WriteLine("i1={0:d5},d1={1:f},c1={2}",i1,d1,c1); i2=c; //隐式类型转换 d2=(int)d; //强制类型转换,转换成整数后再隐式转为double类型 c2=(char)d; //强制类型转换 Console.WriteLine("i2={0:d5},d2={1:f},c2={2}",i2,d2,c2);}}}3.4.3装箱和拆箱1.装箱转换装箱转换是指将一个值类型的数据隐式地转换成一个对象类型的数据。例如,下面语句就执行了装箱转换:
inti=10;objectobj=i;
装箱转换过程2.拆箱转换拆箱转换是指将一个引用类型的数据显式地转换成一个值类型数据。拆箱操作分为两步:首先检查对象实例,确保它是给定值类型的一个装箱值,然后把实例的值复制到值类型数据中。例如,下面两条语句就执行了拆箱转换:objectobj=10;
inti=(int)obj; //拆箱折箱转换过程3.5结构类型和枚举类型3.5.1结构类型1.结构类型的声明结构类型由若干“成员”组成的。数据成员称为字段,每个字段都有自已的数据类型。声明结构类型的一般格式如下:
struct结构类型名称{ [字段访问修饰符]数据类型字段1; [字段访问修饰符]数据类型字段2; ... [字段访问修饰符]数据类型字段n;};例如,以下声明一个具有姓名和年龄的结构体类型Student:structStudent //声明结构类型Student{publicintxh; //学号publicstringxm; //姓名publicstringxb; //性别publicintnl; //年龄publicstringbh; //班号};2.结构类型变量的定义声明一个结构类型后,可以定义该结构类型的变量(简称为结构变量)。定义结构变量的一般格式如下:
结构类型结构变量;例如,在前面的结构类型Student声明后,定义它的两个变量如下:
Students1,s2;3.结构变量的使用1)访问结构变量字段访问结构变量字段的一般格式如下:
结构变量名.字段名例如,s1.xh表示结构变量s1的学号,s2.xm表示结构变量s2的姓名。结构体变量的字段可以在程序中单独使用,与普通变量完全相同。2)结构变量的赋值结构变量的赋值有两种方式。结构变量的字段赋值:使用方法与普通变量相同。结构变量之间赋值:要求赋值的两个结构变量必须类型相同。例如:
s1=s2;这样s2的所有字段值赋给s1的对应字段。【例3.2】设计一个控制台程序说明结构类型的应用。usingSystem;namespaceProj3_2{classProgram{structStudent//结构类型声明应放在Main函数的外面{ publicintxh; //学号 publicstringxm;//姓名 publicstringxb; //性别 publicintnl; //年龄 publicstringbh; //班号}staticvoidMain(string[]args){Students1,s2; //定义两个结构类型变量 s1.xh=101; s1.xm="李明"; s1.xb="男"; s1.nl=20; s1.bh="07001"; Console.WriteLine("学号:{0},姓名:{1},性别:{2},年龄:{3}, 班号:{4}",s1.xh,s1.xm,s1.xb,s1.nl,s1.bh); s2=s1; //将结构变量s1赋给s2 s2.xh=108; s2.xm="王华"; Console.WriteLine("学号:{0},姓名:{1},性别:{2},年龄:{3}, 班号:{4}",s2.xh,s2.xm,s2.xb,s2.nl,s2.bh);}}}3.5.2枚举类型枚举类型也是一种自定义数据类型,它允许用符号代表数据。枚举是指程序中某个变量具有一组确定的值,通过“枚举”可以将其值一一列出来。1.枚举类型的声明枚举类型使用enum关键字声明,其一般语法形式如下:
enum枚举名{枚举成员1,枚举成员2,}其中,enum是结构类型的关键字。例如,以下声明一个名称为color的表示颜色的枚举类型:
enumColor{Red,Green,Blue,White,Black}在声明枚举类型后,可以通过枚举名来访问枚举成员,其使用语法如下:
枚举名.枚举成员2.枚举成员的赋值在声明的枚举类型中,每一个枚举成员都有一个相对应的常量值,默认情况下C#规定第1个枚举成员的值取0,它后面的每一个枚举成员的值按加1递增。例如,前面Color中,Red值为0,Green值为1,Blue值为2,依次类推。可以为一个或多个枚举成员赋整型值,当某个枚举成员赋值后,其后的枚举成员没有赋值的话,自动在前一个枚举成员值之上加1作为其值。例如:
enumColor{Red=0,Green,Blue=3,White,Black=1};则这些枚举成员的值分别为0、1、3、4、1。3.枚举类型变量的定义声明一个枚举类型后,可以定义该枚举类型的变量(简称为枚举变量)。定义枚举变量的一般格式如下:
枚举类型枚举变量;例如,在前面的枚举类型Color声明后,定义它的两个变量如下:
Colorc1,c2;1)枚举变量的赋值枚举变量赋值的语法格式如下:
枚举变量=枚举名.枚举成员例如:
c1=Color.Red;2)枚举变量的访问枚举变量像普通变量一样直接访问。3.6C#运算符和表达式3.6.1算术运算符3.6.2字符串运算符字符串运算符只有一个,就是加号(+)。它除了作为算术运算符之外,还可以将字符串连接起来,变成合并的新字符串。例如:
strings="Hello";s=s+",World.";Console.WriteLine(s);//输出:Hello,World.3.6.3赋值运算符赋值运算符(=)用于改变变量的值,它先求出右侧表达式的结果,然后再将结果赋给左侧的变量。3.6.4关系运算符3.6.5逻辑运算符3.5.6位运算符3.6.7条件运算符条件运算符是一个三元运算符,每个操作数同时又是表达式的值。由条件运算符构成的表达式称为条件表达式。条件运算符的使用格式如下:
表达式1?表达式2:表达式3它的计算方式为,先计算“表达式1”(必须为布尔值)的值,如果其值true,则“表达式2”的值作为整个表达式的最终结果;否则“表达式3”的值作为整个表达式的值。例如,以下表达式返回a和b中的最大值:
max=a>b?a:b计算过程是,当a>b,max=a;否则max=b。3.6.8其他运算符1.is运算符is运算符用于检查表达式是否是指定的类型,如果是,其结果为true,否则结果为false。2.sizeof运算符sizeof运算符求值类型数据在内存中占用的字节数。sizeof运算符的语法格式如下:
sizeof(类型标识符)其结果为一个整数,表示指定类型的数据在内存分配的字节数。该运算符只能作用于值类型或值类型变量。3.typeof运算符该运算符用于获得指定数据类型的说明。例如,若声明了结构Student,则以下语句输出声明Student结构类型的程序名等。Console.WriteLine(typeof(Student));4.new运算符该运算符用于创建一个类的对象。3.6.9运算符的优先级运算符的优先级是指在表达式中哪一个运算符应该首先计算。C#根据运算符的优先级确定表达式的求值顺序:优先级高的运算先做,优先级低的操作后做,相同优先级的操作从左到右依次做,同时用小括号控制运算顺序,任何在小括号内的运算最优先进行。3.7C#中常用类和结构C#中一切都是对象。3.7.1String类string类型是.NETFramework中的String类的别名。string类型定义了相等运算符(==和!=)用于比较两个string对象,另外,+运算符用于连接字符串,[]运算符可以用来访问string中的各个字符。【例3.7】设计一个控制台程序求用户输入的子串在主串中位置。usingSystem;namespaceProj3_6{classProgram{staticvoidMain(string[]args){ Stringmstr,sstr; Console.Write("输入主串:"); mstr=Console.ReadLine(); Console.Write("输入子串:"); sstr=Console.ReadLine(); Console.WriteLine("主串长度={0},子串长度={1}",mstr.Length,sstr.Length); if(String.Compare(mstr,sstr)!=0)//使用静态方法Console.WriteLine("位置:{0}",mstr.IndexOf(sstr)); elseConsole.WriteLine("两个字符串相同");}}}3.7.2Math类Math类位于System命名空间中,它包含了实现C#中常用算术运算功能的方法,这些方法都是静态方法,可通过“Math.方法名(参数)”来使用。3.7.3Convert类Convert类位于System命名空间中,用于将一个值类型转换成另一个值类型。这些方法都是静态方法,可通过“Convert.方法名(参数)”来使用。3.7.4DateTime结构DateTime结构类位于System命名空间中,DateTime值类型表示值范围在公元0001年1月1日午夜12:00:00到公元9999年12月31日晚上11:59:59之间的日期和时间。可以通过以下语法格式定义一个日期时间变量:
DateTime日期时间变量=newDateTime(年,月,日,时,分,秒);例如,以下语句定义了2个日期时间变量:
DateTimed1=newDateT
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 美甲合同转让协议书模板
- 花草租赁解除合同协议书
- 船员培训专项协议书模板
- 网页设计团队外包协议书
- 风力发电安装转让协议书
- 签了购房协议不给签合同
- 电梯加楼梯施工合同协议
- 职工餐厅承包合同协议书
- 门店分红股东协议书范本
- 腺肌病的护理
- 北京市朝阳区2024-2025学年高一下学期期末语文试题(含答案)
- 安徽高危人员管理办法
- 牙外伤护理配合课件
- 2025年辅警招聘考试试题及参考答案
- 2025年湖南省高考物理真题
- 2025年吉林省中考数学试卷真题(含答案详解)
- 医学美容技术专业教学标准(高等职业教育专科)2025修订
- 党课课件含讲稿:以作风建设新成效激发干事创业新作为
- 军事知识科普儿童课件
- 谷歌付费协议书
- 爆破三员安全培训课件
评论
0/150
提交评论