零点起飞学C#之类型.pptx_第1页
零点起飞学C#之类型.pptx_第2页
零点起飞学C#之类型.pptx_第3页
零点起飞学C#之类型.pptx_第4页
零点起飞学C#之类型.pptx_第5页
已阅读5页,还剩42页未读 继续免费阅读

下载本文档

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

文档简介

第3章 类 型,类型是C#语言中最为基本的概念之一。不同类型的变量将拥有不同的数据存储方式和操作方法。但是计算机不像人有聪明的大脑,因此我们需要定义不同的类型去告诉计算机,如何处理这些数据。C#语言的类型系统是统一的,它可以把任何类型的值都按照对象来处理。本章将讲解C#语言中各种类型,主要介绍值类型、引用类型、装箱、拆箱等。,3.1 什么是类型,本节为大家简述C#的类型。C#是一种强类型语言,所有的操作都会经过编译器的类型检查,非法操作将不能通过编译。因此,数据类型更显得重要。C#语言中的每一个类型都直接或间接派生于object类型,即object类型是C#语言所有类型的最终基类型。C#语言的类型可以分为以下3种类型。 值类型(value-type):它的变量直接包含其数据。 引用类型(reference-type):它的变量只存储对其数据的引用(即访问其数据的访问地址)。引用类型的变量又称为对象(object)。,指针类型(point-type):和C、C+语言中的指针类似,而且只能用作在不安全代码中。在C#编程中很少使用指针类型,因此,在此不做详细介绍。 注意:对于值类型而言,值类型的变量总是包含该变量的值,它的值不可能为null。对于引用类型而言,两个变量可以引用同一个对象。因此在操作引用类型的变量时,可能同时修改了另外一个引用类型变量的值。,值类型的变量和引用类型的变量最大的差别就是存储其数据的方式。值类型的变量直接存储其数据,而引用类型的变量直接存储其数据的访问地址。值类型的变量和引用类型的变量存储数据的方式如下图所示。,值类型包含结构类型和枚举类型。结构类型包含数值类型、布尔类型和自定义结构类型。数值类型又包括整数类型、浮点数类型和decimal类型。数值类型包括sbyte、byte、int、uint等类型。引用类型包括object、string、类、接口、委托和数组类型。C#语言的类型关系图如下图所示。,3.2 值 类 型,值类型的变量直接包含其数据,而且其值不可能为null。通俗点讲,值类型是现金,引用类型就是存折。值类型要么是结构类型,要么是枚举类型。在操作值类型的变量时,只会影响该变量的数据,而不会影响另外一个变量的值。所有的值类型都直接或间接派生于System.ValueType类型。本节为大家详细讲述值类型的知识。 注意:System.ValueType类型本身不是值类型,而是引用类型。,值类型包括结构类型、枚举类型、布尔类型、自定义结构类型、sbyte、byte、char、short、ushort、int、uint、long、ulong、float、double和decimal类型。其中,C#语言提供了一种被称为“简单类型(simple type)”的预定义结构类型。这些类型通过C#保留字标识,如char、int等。本节将详细介绍值类型的知识点。,3.2.1 值类型的基础System.ValueType类型,System.ValueType是值类型的基础。所有的值类型都是由它直接或者间接继承而来。它包括以下三个方法: 注意:System.ValueType类型本身不是值类型,而是引用类型,且继承于object类型。 Equals():判定当前实例与指定的对象是否相等。 GetHashCode():返回当前实例的哈希代码。该哈希代码用于哈希表(一种数据结构)的散列运算。 ToString():返回当前实例的完全限定类型名称。,【示例3-1】下面声明一个类型为System.ValueType的、值为10、名称为x的变量,并调用ToString()方法获取该变量的字符串表示形式。最后,在控制台上输出x变量的字符串表示形式。 System.ValueType x = 10; /声明x变量,并赋值为10 Console.WriteLine(x.ToString(); /获取x变量的字符串表示形式,并显示在控制台中 分析:上述代码执行之后,将显示x变量的哈希代码10。,3.2.2 整数类型,整数类型的变量的值为整型。根据各个变量所占位数空间的不同,C#语言提供了9种类型的整数类型,如sbyte、byte、short等。它们的具体说明、.NET Framework中的名称和取值范围如下表所示。,上表中的所有类型都属于简单类型。第1列中的名称为该类型的别名,第3列中的名称为该类型在.NET Framework中相对应的类型的名称,它们表示同样的意义。 1int类型 Int类型用来表示基本的整数类型。它表示的整数是32位,范围从2 147 483 648到2 147 483 647。 【示例3-2】下面声明一个类型为int的、名称为i的变量,并赋值为5。 int i = 5; /声明一个int型的变量i,2long类型 Long类型用来表示有符号的整数类型。它表示的整数是64位,范围从9 223 372 036 854 775 808到9 223 372 036 854 775 807。 【示例3-3】下面声明一个类型为long的、名称为j的变量,并赋值为200 800 000 000 000。 long j = 200800000000000; /声明一个long型的变量j,3char类型 char类型表示一个16位的unicode字符,而且可以隐式转换为一个整数,反之则不行。 【示例3-4】下面声明一个类型为char的、名称为s的变量,并赋值为a。在书写字符时,该字符要被单引号()包围。 char s = a; /声明一个char型的变量s,【示例3-5】下面声明一个类型为char的、名称为s2的变量,并赋值为(char)10。(char)10表达式表示将整数10强制转换为char类型的变量。 char s2 = (char)10; /声明一个char型的变量s2,并将其赋值为10强制转换成的char类型 【示例3-6】下面声明一个类型为char的、名称为s3的变量,并赋值为x000A。x000A表达式为一个16进制数值。 char s3 = x000A; /声明一个char型的变量s3 注意:c2和c3变量表示同一个字符。,3.2.3 浮点型,浮点型数据表示的是实数,当计算的表达式有精度要求时被使用。C#提供了两种浮点型:单精度浮点型(float)和双精度浮点型(double)。float类型表示32位的单精度浮点数,它的取值范围为1.5e-453.4e38。double类型表示64位的双精度浮点数,它的取值范围为 5.0e-3241.7e308。浮点数包括以下3种特殊的值。 正零和负零:一般情况下,正零和负零的行为与简单的值零相同,但某些运算会区别对待此两种零。,正无穷大和负无穷大:无穷大是由非零数字被零除这样的运算产生的。例如,1.0/0.0产生正无穷大,而1.0/0.0产生负无穷大。 非数字(Not-a-Number)值:常缩写为NaN。NaN是由无效的浮点运算(如零被零除)产生的。 在直接书写float类型的变量的值时,必须在数值后添加后缀f或者F,否则编译出错。,【示例3-7】下面声明一个类型为float的、名称为f的变量,并赋值为100.1。 float f = 100.1f; /声明一个float型的变量f 同样地,在直接书写double类型的变量的值时,必须在数值后添加后缀d或者D,否则编译出错。 【示例3-8】下面声明一个类型为double的、名称为d的变量,并赋值为100.1。 double d = 100.1d; /声明一个double型的变量d 注意:浮点数在运算时,从来不会产生异常。相反,在异常情况下,浮点运算产生零、无穷大或NaN等值。例如,浮点运算的一个或两个操作数为NaN,或者当浮点数运算无效时,则运算的结果变成NaN。,3.2.4 decimal类型,decimal类型通常用来表示财务计算和货币计算。decimal类型表示128位的数值,取值范围为1.0e-287.9e28。书写decimal类型的值时,需要在数值后添加后缀m,否则编译出错。 【示例3-9】下面声明一个类型为decimal的、名称为de的变量,并赋值为100.123。 decimal de = 100.123m; /声明一个decimal型的变量de 注意:decimal类型不支持有符号的零、无穷大和NaN。,与浮点型相比,decimal类型具有较高的精度,但取值范围较小。因此,从浮点型到decimal类型的转换可能会产生溢出异常,而从decimal类型到浮点型的转换则可能导致精度损失。正是由于这些原因,所以,在浮点型和decimal类型之间不存在隐式转换。如果要转换浮点型到decimal类型,则必须使用强制转换方法。,【示例3-10】下面声明一个类型为float的、名称为fl的变量,并赋值为100.123。然后通过强制转换方式将fl变量的值转换为decimal类型的de变量。 float fl = 100.1f; decimal de = (decimal)fl; /声明一个decimal型的变量de,并赋值为将float型的变量fl强制转换成的decimal类型 注意:浮点数在运算时,从来不会产生异常。而decimal类型的值在运算时会产生异常,如当除数为0时。,3.2.5 bool类型,布尔(bool)类型表示真或假值。它只包含两个值:true和false,而且这两个值意义恰好相反。因此bool类型的变量或者表达式只能取这两个值中的一个。布尔类型和其他类型之间不存在任何标准转换。 【示例3-11】下面声明一个类型为bool的、名称为b的变量,并赋值为true。 bool b = true; /声明一个bool型的变量b,【示例3-12】下面声明一个类型为bool的、名称为b1的变量,并赋值为false。 bool b1 = false; /声明一个bool型的变量b1 注意:b和b1变量的值恰恰相反。因此,b1 = !b。其中,!为逻辑非运算符。,3.2.6 枚举类型,枚举类型是为一组在逻辑上密不可分的整数值提供便于记忆的符号。它是把相同类型、表达固定含义的一组数据作为一个集合放到一起形成新的数据类型。枚举类型也是一种值类型,它具有命名常量的独特的类型。每个枚举类型都有一个基础类型,该基础类型必须为byte、sbyte、short、ushort、int、uint、long或ulong。其中,默认的基础类型为int。 枚举类型一般包含一个或多个枚举值,每一个枚举值之间用逗号(,)分隔。枚举值又称为枚举数,它的默认基础类型为int。默认情况下,第一个枚举数的值为0,后面的每一个枚举数的值依次增1。,【示例3-13】下面声明一个名称为Week的枚举类型。 01 enum Week /声明一个枚举类型 02 03 Sunday = 0, 04 Monday, 05 Tuesday, 06 Wednesday, 07 Thursday, 08 Friday, 09 Saturday 10 ,Week类型包含7个枚举数:Sunday、Monday、Tuesday、Wednesday、Thursday、Friday和Saturday,分别表示星期中的每一天。Sunday枚举数的值为0,其他枚举数的值依次增1。 在声明枚举时,如果为该枚举添加了位标记Flags,那么该枚举的枚举数可以按照位运算方法进行运算。,【示例3-14】下面声明一个名称为File的枚举类型,并添加了位标记Flags。 01 Flags 02 enum File /声明一个枚举类型 03 04 None = 0, 05 Read = 1, 06 Write = 2, 07 Delete = 4 08 ,FileA类型包含4个枚举数:None、Read、Write和Delete,分别表示对文件不具有访问权限、读权限、写权限和删除权限。None、Read、Write和Delete枚举数的值分别为0、1、2和4。 如果某用户对一个文件既具有读权限,又具有写权限了,可以把File枚举数进行位运算得到。 【示例3-15】下面声明一个名称为x的、类型为File的变量。它的值由File枚举类型的Read和Write枚举数进行或运算得到。 File x = File.Read | File.Write; 注意:由于File.Read和File.Write的值分别为1和2,那么x变量的值应该为3(“1|2”表达式的结果)。,3.2.7 结构类型,结构类型通常是一组相关信息组合成的单一实体。其中的每个信息称为它的一个成员。结构类型在创建如点结构等小型对象的时候很灵活。结构类型也是一种值类型,它可以声明常量、字段、方法、属性、索引器、运算符、实例构造函数、静态构造函数和嵌套类型。有关结构类型的知识将在第9章中进行详细介绍。,3.3 引 用 类 型,引用类型的变量又称为对象,可存储对实际数据的引用。将一个变量指定给另一个变量时,只是指定了引用,而不是值。引用类型主要包括6种类型:对象类型、字符串类型、类类型、数组类型、接口类型和委托类型。引用类型继承自System.Object类。本节将详细介绍引用类型的知识。 注意:在使用引用类型的变量之前,往往要判断该变量的值是否为null。如果为null,则不能直接访问该变量。,3.3.1 类类型,类是C#或者面向对象程序设计中最重要的组成部分,如果没有类,所有使用C#编写的程序都不能进行编译。由于类声明创建了新的引用类型,所以就生成了一个类类型。类类型中包含了数据、函数和嵌套类型。其中,数据成员包括常量和字段,函数成员包括方法、属性、事件、索引器、运算符、实例构造函数、析构函数和静态构造函数。 特别地,类类型还支持一种被称为“继承”的机制。继承是指派生类可用来扩展和专门化基类的一种机制。有关类类型的知识将在第8章中进行详细介绍。,3.3.2 对象类型,object类型是C#内置的引用类型。在C#的统一类型系统中,所有类型都是直接或间接从object继承的。因此,C#中的任何类型都可以转换为object类型。 【示例3-16】下面声明一个类型为object的、名称为o的变量,并赋值为10。 object o = 10; /声明一个object类型的变量o 注意:object关键字仅仅是System.Object类的别名。,3.3.3 字符串类型,string类型也是C#内置的引用类型。字符串类型表示零或更多Unicode字符组成的序列。字符串(string)类型是直接从object继承而来的类类型,它对应着.NET Framework中的System.String类型。 【示例3-17】下面声明一个类型为string的、名称为s的变量,并赋值为abc字符串。 string s = “abc“; /声明一个string类型的变量s并赋初值abc string类的实例表示一串字符序列,即字符串。在书写字符串时,字符串要被双引号(“)包围。 注意:string类的实例是不可修改的。即一个字符串一旦被创建之后,它不能被修改。,【示例3-18】下面声明一个类型为string的、名称为s1的变量,并赋值为2012字符串。然后对s1变量执行赋值操作,并设置s1变量的值为2013字符串。 string s1 = “2012“; /声明一个string类型的变量s1并赋初值2012 s1 = “2013“; /将s1赋值为2013 在执行“string s1 = “2012“;”语句时,系统为s1变量分配了一块内存。在执行“s1 = “2013“;”语句时,系统又为s1变量分配了另外一块内存。这两块内存不是同一块内存。因此,对于s1变量分配而言,它的内容是不能被修改的。,执行“s1 = “ 2013 “;”语句的前后内存分别如下图所示。 注意:2012字符串所占用的内存是不能被修改的。 有关字符串类型的知识将在第19章中进行详细介绍。,3.3.4 数组类型,数组是指同类型数据组成的集合,它是数据最常用的存储方式之一。C#中的数组可以通过计算索引来访问数组中的每一个元素。每一个元素的类型称为数组的元素类型。有关数组类型的知识将在第10章中进行详细介绍。 【示例3-19】下面声明一个名称为arr的、元素类型为int的数组。在声明数组时,元素类型之后要紧跟一个中括号()。 int arr; /声明一个数组arr,3.3.5 接口类型,接口类型定义了一种标准。C#接口只有签名,没有实现代码。所以只能从接口衍生对象而不能对接口进行实例化。接口就相当于对象之间的协议一样,在调用接口时可以不关心接口具体实现方法。这样某个对象进行改变时,其他对象不用进行任何修改还可正常运行。接口是一个数据结构,能够声明数据成员和函数成员。其中,数据成员主要包括属性,函数成员包括方法和事件。,【示例3-20】下面声明一个名称为Iinterface的接口。该接口声明了一个名称为Name的属性。 01 interface Iinterface /声明一个接口Iinterface 02 03 string Name 04 05 get; 06 set; 07 08 注意:在接口中只能声明属性、方法和事件,而不能实现这些属性、方法和事件。接口只是一种协定。实现某接口的类或结构必须遵守该接口定义的协定。 有关接口类型的知识将在第11章中进行详细介绍。,3.3.6 委托类型,委托类型的出现是为了弥补C#中去掉指针对灵活性带来的影响。委托是完全面向对象的,它把一个对象实例和方法进行了封装,所以委托是类型安全的。委托是一种数据结构,它能够引用一个或多个方法。特别地,对于实例方法,它还能够引用这些方法所对应的对象实例。委托类型能够将方法作为参数进行传递,并且还可以定义回调方法。有关接口类型的知识将在第12章中进行详细介绍。,【示例3-21】下面声明一个名称为MyFunction的委托。该委托指定的方法包含两个int类型的参数,且返回一个int的值。 delegate int MyFunction(int x,int y); /声明一个委托MyFunction,3.4 装箱和拆箱,装箱和拆箱是C#的类型系统中两个很重要的概念,它在值类型和引用类型之间架起了一座桥梁。通过装箱和拆箱操作,可以将任何值类型的变量的值与引用类型的变量的值转换。特别是可以将C#类型系统中的任何类型的值最终都可以按对象来处理。,3.4.1 装箱,引用类型总是分配在托管堆上,而值类型总是分配在堆栈上。装箱是指将值类型隐式转换为引用类型。对于值类型而言,装箱的具体过程:首先分配一个对象实例,然后将值类型的值复制到该实例中。装箱前后不是同一个实例。对于引用类型而言,装

温馨提示

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

评论

0/150

提交评论