资源描述
,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,2012/12/20,#,单击此处编辑母版标题样式,第,3,章 定义类,字段,通过第,2,章我们主要了解了类的基础知识,这一章我们将带领大家继续学习类。类主要包括字段、方法和属性三大成员。字段(,field,)是一种表示与对象或类关联的变量的成员,字段声明用于引入一个或多个给定类型的字段。这一章我们将重点给大家介绍如何定义类中的字段。,3.1,数据类型,数据类型决定了数据在计算机中的存储方式和处理方式。为了更好让计算机处理数据,我们需要正确使用数据类型。,C#,中数据的类型很重要,为了保证运行过程中类型的兼容,所有的操作都要经过编译器的类型检查。类型不兼容将不能通过编译,这样有利于防止出错,增强程序的稳定性,因此我们有必要来学习一下数据类型的知识。,数据类型,考虑到大家的理解难易,在这一章中我们只向大家介绍简单值类型,复合值类型和引用类型将会在后面的章节中介绍,。,C#,中的数据类型分类如下图所示。,3.1.1,简单值类型,简单值类型是组成应用程序中基本构建的类型,也是编程中使用较多的类型,我们这里主要给大家介绍四种简单值类型。,1.,整数类型,C#,定义了,8,种主要的整数类型,它们对应的位宽与取值范围如下表所示。,类型,位宽,取值范围,byte,8,02,8,sbyte,8,-2,7,2,7,-1,short,16,-2,15,2,15-1,ushort,16,02,16,int,32,-2,31,2,31,-1,uint,32,02,32,long,64,-2,63,2,63,ulong,64,02,64,简单值类型,C,#,定义了各种整数类型的有符号形式和无符号形式,两种形式的,区别如下:,简单值类型,2.,字符类型,字符类型也称为,char,类型,,它,是采用,Unicode,编码的,16,位字符类型。在,C#,中,,char,类型是无符号的,其取值范围为,065535,。标准的,8,位,ASCII,字符集是,Unicode,字符集的子集,其取值范围为,0127,,因此,,ASCII,字符仍然是有效的,C#,字符串,。,ASCII,值,控制字符,ASCII,值,控制字符,ASCII,值,控制字符,ASCII,值,控制字符,0,NUT,32,(space),64,96,、,1,SOH,33,!,65,A,97,a,2,STX,34,”,66,B,98,b,3,ETX,35,#,67,C,99,c,4,EOT,36,$,68,D,100,d,5,ENQ,37,%,69,E,101,e,简单值类型,3.,浮点类型,浮点类型可以表示带有小数部分的数值,主要分为三种类型,float,、,double,和,decimal,,三种类型的说明和取值,范围如下:,4.,布尔类型,布尔(,bool,)类型表示布尔逻辑量,其值只可能是,true,和,false,。因此,布尔类型的变量或者表达式将只能取这两个值中的一个。,数据类型,说明,取值范围,float,32,位单精度实数,1.5,10,-45,3.4,10,38,double,64,位双精度实数,5.0,10,-324,1.7,10,308,decimal,128,位十进制实数,1.0,10,-28,-7.9,10,28,3.1.2,值的表示,字面量,在,C#,中,字面量(,literal,)是指以人们易于阅读的格式表示的固定值。例如,数值,100,是一个字面量。在很大程度上,字面量及其用法非常直观,下面我们将以表格形式给出大家这些用法和示例。,字面量,1.,整型字面量,整型字面量指定的数值不包含小数部分,例如,,10,和,-100,都是整数字面量。另外,字面量的类型采用能够保存该数值的最小整型类型即可,首先考虑的,int,类型,整型字面量的类型范围由小到大依次为:,int,、,uint,、,long,和,ulong,。具体类型由该字面量的值决定,且通过附加后缀来显示地指定其,类型。,类型,类别,后缀,示例,int,uint,long,ulong,整数,无,120,uint,ulong,整数,u,或,U,120U,long,ulong,整数,l,或,L,120L,ulong,整数,ul,、,uL,、,Ul,、,UL,、,lu,、,lU,、,Lu,或,LU,100UL,字面量,2.,浮点型字面量,浮点字面量需要包含小数点,后跟数值的小数部分,如,25.46,。浮点型字面量的类型默认为,double,类型,同样地也可以通过附加后缀来显示地指定,类型。另外,,浮点型数还可以通过科学计数法来表示,。,类型,类别,后缀,示例,float,实数,f,或,F,1.5F,double,实数,无、,d,或,D,1.5,decimal,实数,m,或,M,1.5M,字面量,3.,字符型字面量,字符类型通常通过添加单引号来表示,如,a,或,A,。这种表示方法对于大部分打印字符是有效的,但是对于一些非打印字符,如回车等则不能直接表示它们,,C#,提出了专门的转义序列去表示,它们。,4.,布尔型字面量,布尔型数值的字面量比较简单,只有,true,或,false,两种。,3.1.3,转义序列,包含反斜杠“,”的字符组合后跟字母或用数字的组合称为转义序列,有时也称为反斜杠字符常量。它解决了一些非打印字符,如回车,在使用文本编辑器时出现的问题。字符类型在定义时就用到转义序列,。,完整的字符转义序列表如下:,转义序列,产生的字符,字符的,Unicode,值,单引号,0 x0027,双引号,0 x0022,/,反斜杠,0 x005C,0,空,0 x0000,a,警报,0 x0007,b,退格,0 x0008,f,换页符,0 x000C,n,换行符,0 x000A,r,回车,0 x000D,t,水平制表符,0 x0009,v,垂直制表符,0 x000B,3.2,定义字段,掌握了数据类型的知识后,我们来介绍本章的重点也就是字段的定义,会给大家讲到字段定义的基本形式、字段的分类以及初始化的内容。,3.2.1,定义字段,常用的字段定义形式如下:,以下代码演示的是定义字段的方式。,3.2.2,静态字段和实例字段的访问,字段可以分为静态字段和实例字段,在进行字段声明时,如果其中含有,static,修饰符,称这个字段为静态字段;反之,若不含有,static,修饰符称之为实例字段。静态字段可以通过类来访问,实例字段需要通过对象来访问。,静态字段和实例字段,静态字段和实例字段的区别如下:,3.2.3,字段初始化,初始化就是把变量赋为默认值,把控件设为默认状态,把没准备的准备好。字段初始化就是给字段设定初始值,我们首先需要介绍一下赋值运算符。,字段初始化,1.,赋值运算符,赋值运算符可以把表达式的运行结果赋值给一个变量,从而根据输出的这个变量的值可以得到表达式的结果,它可以分为三种类型。,“,=,”运算符称为简单赋值运算符。它将右操作数的值赋予左操作数,其基本,形式如下:,字段初始化,2.,字段初始化,字段初始化即给字段一个初始值,也就是把等号右边的值赋给左边的字段。其基本形式,如下:,一,个变量一次只能接受一个值,字段也不例外。,以下,代码演示的是字段初始化前后的变化。,字段(无论是静态字段还是实例字段)的初始值都是字段的类型的默认值。在此默认初始化发生之前是不可能看到字段的值的,因此字段永远不会是“未初始化的”。,字段初始化,以下代码演示的是字段初始化前后的变化。,字段初始化,以下,代码演示的是字段被初始化为默认值,。,字段初始化,实例字段和静态字段在初始化时的区别如下:,3.2.4,字段的动态赋值,Read(),和,ReadLine(),在编程时,用户还可以自己从键盘输入给字段赋值,赋值方式就是利用,Read(),和,ReadLine(),。这是两种方法,大家在这儿只需知道如何用即可。,1.Read(),Read(),用于从标准输入流读取下一个字符。它能够将输出窗口打开一段时间,直到有字符从键盘输入,按“,Enter,”键窗口关闭。以下代码演示的是使用,Read(),方法赋值的方法。,在输出窗口中输入值,按,Enter,键后,窗口关闭。输入的值自动赋给了字段,i,。如果在输出窗口中输入的字符超过一个,系统将截取第一个赋给字段。需要注意的是字段类型必须是,ushort,、,int,、,uint,、,long,、,ulong,、,float,、,double,或,decimal,中的一种,否则将因为类型不兼容出现错误。,字段的动态赋值,以下,代码演示的是字段类型为,bool,时不兼容,。,2.ReadLine,(),ReadLine(),用于从标准输入流读取下一行字符,接受字符的字段必须是,string,型的。这种类型我们在后面章节后介绍到。在这里我们可以简单的理解为在输出窗口输入的应该是多个字符,。,字段的动态赋值,以下,代码演示的是使用,ReadLine(),方法赋值的方法,。,与,Write(),一样,如果字段类型为其他类型系统将报错。,3.2.5,字段输出,给字段赋值时,如果想看到赋值后的参数的值,我们需要用到,C#,中已定义好的方法:,Write(),或者,Writeline(),进行输出。,以下代码演示的是使用,Write(),方法查看赋值后的参数的值。,如果有多个字段时,应该用逗号将其隔开,而且占位符从,0,开始。,字段输出,以下,代码演示的是,使用,WriteLine,(),方法查看多个字段的值,。,这两个方法的作用是相似的,但是有一点小的区别需要给大家说清楚。,字段输出,以下,代码演示的是,Write(),方法和,WriteLine(),方法的区别。,3.2.6,格式化输出,C#,提供了一系列特殊的格式化符,可以使数据格式化。例如,可以用逗号将数字分开或显示值的小数部分。这对我们控制输出字符的格式很有帮助,这一节我们就来学习一下这些格式化符。这儿主要给大家介绍两种,标准数字格式说明符和自定义数字格式说明符。,格式化输出,1.,标准数字格式说明符,(,1,)输出货币值 “,C,”(或货币)格式说明符将数字转换为表示货币金额的字符,适用于所有类型的数值。格式和说明如图:,格式化输出,以下,代码演示的是输出值为货币时的格式说明符。,格式化输出,(,2,)输出十进制整数,“,D”,(或十进制)格式说明符将数字转换为十进制数字(,09,)的字符。如果数字为负,则前面加负号。只有整型才支持此格式。格式及说明,如下图所示,:,【,示例,3-13,】,演示的是输出,值为十进制整数的格式说明符。,格式化输出,(,3,)输出科学计数法数,指数(“,E”,)格式说明符将数字转换为“,-d.dddE+ddd”,或“,-d.ddde+ddd”,形式的字符,其中每个“,d”,表示一个数字,(0-9),。如果该数字为负,则该字符串以减号开头,小数点前总是恰好有一个数字。其他格式及说明,如下图所,示,。,【,示例,3-14,】,演示的是输出,值为科学计数法数的格式说明符。,格式化输出,(,4,)输出定点数,定点(“,F”,)格式说明符将数字转换为“,-ddd.ddd”,形式的字符,其中每个“,d”,表示一个数字,(0-9),。如果该数字为负,则该字符以减号开头。其格式及说明,如下图所,示,。,【,示例,3-15,】,演示的是输出,值为定点数的格式说明符。,格式化输出,(,5,)输出常规数,根据数字类型以及是否存在精度说明符,常规(“,G”,)格式说明符将数字转换为最紧凑的定点表示法或科学记数法。精度说明符定义可以出现在结果字符中的最大有效位数。如果精度说明符被省略或为零,则数字的类型决定默认精度,,如下表所,示。,数值类型,默认精度值,Byte,或,SByte,3,位,Int16,或,UInt16,5,位,Int32,或,UInt32,10,位,Int64,19,位,UInt64,20,位,Float,7,位,Double,15,位,Decimal,29,位,格式化输出,如果用科学记数法表示数字时指数大于,-5,而且小于精度说明符,则使用定点表示法;否则使用科学记数法。结果包含小数点(如果需要),并且忽略小数点后面的尾部零。如果精度说明符存在,并且结果的有效位数超过指定精度,则通过舍入移除多余的尾部数字,。,【,示例,3-16,】,演示的是输出,值为定点法和科学计数法的选取,。,但是,,如果数字是,Decimal,并且省略精度说明符,将总是使用定点表示法并保留尾部零。用科学记数法时,如果格式说明符是“,G”,,则结果的指数带前缀“,E”,;如果格式说明符是“,g”,,则结果的指数带前缀“,e”,。指数最少包含两个数字。,【,示例,3-17,】,演示,的是输出值为常规数的格式说明符。,格式化输出,(,6,)输出,Number,数,数字,(,“N”,),格式说明符将数字转换,为,“-,d,ddd,ddd.ddd,”,形式,的字符,,其中,“-”,表示,负数符号(如果需要,),,“d”,表示,数字,(0-9),,,“,”,表示,组分隔符,,,“.”,表示,小数点符号,其格式和说明,如下图所,示,。,【,示例,3-18,】,演示的是输出,值为,Number,数的格式说明符。,格式化输出,(,7,)输出百分比,百分比(“,P”,)格式说明符将数字乘以,100,并将其转换为表示百分比的字符串。其格式与说明,如下图所示。,【,示例,3-19,】,演示的是输出,值为百分比的格式说明符。,格式化输出,2.,自定义数字格式说明符,(,1,)“,0,”自定义说明符,“,0”,自定义格式说明符用作零占位符符号,,下图给,出了其格式及说明,。,【,示例,3-20,】,演示,的是“,0,”自定义说明符的使用。,格式化输出,(,2,)“,#,”自定义说明符,“,#,”自定义格式说明符用作数字占位符符号。如果设置了格式的值在格式字符串中显示“,#,”的位置有一个数字,则此数字被复制到结果字符串中。否则,结果字符串中的此位置不存储任何值。,【,示例,3-21,】,演示,的是“,#,”自定义说明符的使用。,需要注意,如果零不是有效数字,此说明符永不显示零,即使零是字符串中的唯一数字也是如此。仅当零是所显示的数字中的有效数字时,才会显示零。,格式化输出,(,3,)“,.,”自定义说明符,.,自定义格式说明符在结果字符串中插入小数分隔符。格式字符串中的第一个小数点确定设置了格式的值中的小数分隔符的位置;任何其他小数点会被忽略。,【,示例,3-22,】,演示,的是“,.,”自定义说明符的使用。,(,4,)“,”自定义说明符,“,”字符用作组分隔符和数字比例换算说明符。作为组分隔符时,它在各个组之间插入组分隔符字符。作为数字比例换算说明符,对于每个指定的逗号,它将数字除以,1000,。,【,示例,3-23,】,演示,的是“,”自定义说明符的使用。,3.2.7,数据类型转换,当赋值运算符的右边的数据类型和左边的数据类型不一样时,这时候就出现了数据类型转换。数据类型转换可以分为隐式转换和显示转换。,1.,隐式转换,C#,允许不同类型的值出现在一个表达式中。当表达式中有不同类型的操作数时,认为这个表达式是一个混合模式表达式,,如,下,图所,示。,数据类型转换,下表列出,了编译器可以隐式执行的数值转换。,在隐式转换中,我们需要注意几点:,(,1,)从,int,、,uint,或,long,到,float,的转换以及从,long,到,double,的转换的精度可能会降低,但数值大小不受影响。,从,到,sbyte,short,、,int,、,long,、,float,、,double,或,decimal,byte,short,、,ushort,、,int,、,uint,、,long,、,ulong,、,float,、,double,或,decimal,short,int,、,long,、,float,、,double,或,decimal,ushort,int,、,uint,、,long,、,ulong,、,float,、,double,或,decima,int,long,、,float,、,double,或,decimal,uint,long,、,ulong,、,float,、,double,或,decimal,long,float,、,double,或,decimal,char,ushort,、,int,、,uint,、,long,、,ulong,、,float,、,double,或,decimal,float,double,ulong,float,、,double,或,decimal,数据类型转换,(,2,)不,存在到,char,类型的隐式转换。,(,3,),不,存在浮点型与,decimal,类型之间的隐式转换。,(,4,),int,类型的常数表达式可转换为,sbyte,、,byte,、,short,、,ushort,、,uint,或,ulong,,前提是常数表达式的值处于目标类型的范围之内。,【,示例,3-24,】,演示,的是隐式类型转换。,【,示例,3-25,】,演示,的是无法隐式转换的类型。,显示转换提供了解决示例,3-25,的方式。,数据类型转换,2.,显,式,转换,从类型,A,到类型,B,的转换只能在某些情况下进行,转换的规则比较复杂,应进行某种类型的处理。转换的格式如下图所示。,隐式转换使得一个变量临时地扮演一个不同类型的角色。在示例,3-25,中,浮点型和整型无法隐式转换,我们尝试用显示转换来执行。,【,示例,3-26】,演示的是使用显,式,转换来转换类型。,3.2.8,只读字段,当字段声明中含有,readonly,修饰符时,该声明所引入的字段为只读字段。只读字段的声明格式如下图所示。,只读字段是在运行时初始化的,因此比较灵活,能够为用户提供更多的功能。,【,示例,3-27】,演示的是一个只读字段的声明方式。,在示例,3-27,中,对象的创建日期是在编译时期无法知道的,因此,readonly,修饰符是处理这种情况的最佳方式。,3.2.9,访问控制,在程序编写过程中,有的成员对所有人都是透明的,但是有些成员程序员只想被一部分人看到和使用,因此我们可以对这些成员进行访问控制,这就需要用到访问修饰符。,C#,中的访问修饰符主要包括,public,、,private,、,protected,和,internal,,我们下面将给大家详细介绍这些修饰符的作用。,1.public,修饰符,public,修饰符表示声明的成员是公有的,不限制对该成员的访问,它是限制最低的一种修饰符。,【,示例,3-28】,演示的是使用,public,修饰符修饰,C#,成员,i,及它的访问方式。,访问控制,2.private,和,protected,修饰符,private,和,protected,修饰符比较类似,因为被它们修饰的成员,只能在声明类的内部使用,在其他类中访问会提示错误。但是二者也有区别,主要是在出现继承关系时,这个内容我们将在后面章节讲到。下面例子展示了这两个修饰符的用法。,【,示例,3-29,】,演示,的是使用,private,和,protected,修饰符修饰,C#,成员,i,和,j,及它们的访问方式。,需要提醒大家的是,在类中如果没有明确声明,成员都默认为,private,。,3.internal,修饰符,internal,修饰符表示声明的成员是内部的,该成员仅限于同一程序集内部访问。这个问题涉及到了程序集,比较复杂,我们在这儿不再深入讲解,大家只需了解即可。,3.3,运算符,C#,提供了大量的运算符,这些运算符使得程序员可以具体的控制表达式的结构和运算。赋值运算符在本章第二节中已经介绍过了一小部分,我们在这一节来进行补充并且介绍一下,C#,中其他常用的运算符。,3.3.1,算术运算符,算术运算符包括加、减、乘、除运算符(,+,、,-,、*、,/,)和求模取余运算符(,%,)。算术运算符是双目运算符,也就是需要两个操作数,其操作数一般是整数和浮点数(或者是结果为整数或浮点数的表达式)。,C#,语言中的算术运算符符号、名称、功能及其相关示例,如下表所示,已知,a=10,,,b=4,。,运算符,运算符名称,功能,示例,结合性,结果,+,加法运算符,表示两个数相加,a+b,自左向右,14,-,减法运算符,表示两个数相减,a-b,自左向右,6,*,乘法运算符,表示两个数相乘,a*b,自左向右,40,/,除法运算符,表示两个数相除,a/b,自左向右,2.5,%,模运算符,表示取模,a%b,自左向右,2,算术运算符,在进行包含多个算术运算符的表达式运算时,需要注意算术运算符的优先级和结合性。算术运算符的结合性都是从左到右;算术运算符的优先级,如下图所,示,。,虽然,算术运算符的操作对所有读者来说并不陌生,但是有必要对一些特殊情况进行说明。,【,示例,3-30,】,演示,的是算术运算符的使用方式。,3.3.2,自增、自减运算符,普通算术运算符在书写时至少需要两个操作数,为了简便,,C#,提供了自增、自减运算符“,+,”和“,-,”,它们的表示形式和实现功能如下图所示。,我们来看一下自增、自减运算符是如何简化了普通算术运算符的,如下图所示。,自增、自减运算符,+,和,-,出现在左边与出现在右边的结果是不一样的:出现在左边时,先递增或递减然后赋值;出现在右边时,先赋值然后才递增或递减。,【,示例,3-31,】,演示,的是自增、自减运算符的使用方式。,3.3.3,复合赋值运算符,通常要修改一个变量的值时,我们都会把该变量作为表达式的一部分,如下所示。,answer=100;,answer=answer+5;,复合赋值运算符通过将最终结果作为计算的一部分,提供了一种简便方法去写赋值运算。上面程序如果改用复合赋值运算符应该如下图所示。,复合赋值运算符,使用这种运算符,特别是在使用长变量名时,可以使代码,更便于,阅读,。下表列出,了常用复合赋值运算符及其说明。,运算符,类别,示例表达式,结果,+=,二元,var1+=var2,var1,被赋予了,var1,与,var2,的和,-=,二元,var1-=var2,var1,被赋予了,var1,与,var2,的差,*=,二元,var1*=var2,var1,被赋予了,var1,与,var2,的乘积,/=,二元,var1/=var2,var1,被赋予了,var1,与,var2,相除所得的结果,%=,二元,var1%=var2,var1,被赋予了,var1,与,var2,相除所得的余数,3.3.4,位运算符,C#,语言提供的位运算符如下表所示:,对“,&|,”这四种位运算的规则下图所示:,位运算符,含义,结合性,&,按位与,自左向右,|,按位或,自左向右,按位异或,自左向右,按位取反,自右向左,右移,自左向右,位运算符,由于左移右移的位运算比较复杂,下面主要讲解左移与右移。左移与右移的概念,如下表所,示:,符号,名称,作用,意义,说明,左移位,将操作数的二进制位整体按照顺序向左移,右端空出的位补,0,,左端移出最高位意外的位丢失,a,右移位,将操作数的二进制位整体按照顺序向右移,左端补,0,或补,1,,右端移出超出最低位被丢失,an,,代表,a,的二进制位顺序右移,n,位(,n,为整数),右移运算与操作数的符号有关,.,就,C#,而言,:无符号数为,“,逻辑右移,”,,即左端空出位一律补,0,;有符号数为,“,算术右移,”,,即正数右移,空位补,0,负数右移,空位补,1,3.3.5,sizeof,运算符,由于不同的计算机支持的数据类型长度是不一样的,因此需要一个运算符来测量该机器中的数据类型长度。,C#,中提供了,sizeof,运算符,其作用和使用格式如下图所示。,该运算符的运算结果是类型名所表示类型的长度或表达式的值所占用的字节数,即这个值所属类型的长度。,【,示例,3-32】,演示的是,sizeof,运算符的使用方式。,3.3.6,运算符的优先级,当多种运算符出现在同一个表达式时,总是从优先级最高的那种运算符开始执行。优先级就是操作运算的顺序,有更高优先级的子表达式先被计算。此外,有左和右两种结合性;左结合性的运算符从左到右计算,右运算符则从右向左计算。下表列举了,C#,运算的优先级和结合性。,运算符的优先级,优先级,运算符,功能说明,结合性,1,(),:,.,-,.*,-*,改变优先级,作用域运算符,数组下标,成员选择,成员指针选择,从左至右,2,+,,,-,&,*,!,+,-,(),sizeof,new,delete,增,1,,减,1,运算符,取地址,取内容,逻辑求反,按位求反,取正数,取负数,强制类型,取所占内存字节数,动态存储分配,从右至左,3,*,/,%,乘法,除法,取余,从左至右,4,+,,,-,加法,减法,从左至右,5,左移位,右移位,从左至右,6,=,小于,小于等于,大于,大于等于,从左至右,7,=,,!,=,相等,不等于,从左至右,8,&,按位与,从左至右,9,按位异或,从左至右,10,|,按位或,从左至右,11,&,逻辑与,从左至右,12,|,逻辑或,从左至右,13,?:,三目运算符,从右向左,14,=,,,+=,,,=,,,*=,,,/=,,,%=,,,&=,,,=,,,|=,,,=,赋值运算符,从右至左,15,,,逗号运算符,从左至右,运算符的优先级,【,示例,3-33】,演示的是根据运算符的优先级执行表达式的顺序。,3.4,小结,本章主要向大家介绍了如何定义字段,包括静态字段、实例字段以及只读字段;介绍了字段如何进行初始化,同时介绍了一些简单的数据类型和一些常用到的运算符。本章的重点在于字段的定义,难点同样也是要学会如何定义字段,特别是三种类型的字段。,
展开阅读全文