



C#语言支持通用类型系统,其数据类型既包括基本的类型,如int、char和float等,也包括比较复杂的引用类型,如string和object等。作为一种面向对象的语言,C#中的所有数据类型都是一个类,它们具有格式化、序列化及类型转换等方法。下面对数据类型进行详细介绍。
C#中的数据类型根据其定义可以分为两种:一种是值类型,另一种是引用类型。这两种类型的差异在于数据的存储方式,值类型直接存储数据;而引用类型则存储实际数据的引用,程序通过此引用找到真正的数据。
值类型直接存储数据值,它主要包含整数类型、浮点类型及布尔类型等。值类型在内存的栈中进行分配,因此效率很高,使用值类型主要是为了提高性能。值类型具有如下特性:
值类型变量都存储在内存的栈中。
每个值类型变量都有自己的数据副本,因此对一个值类型变量的操作不会影响其他变量。
复制值类型变量时,复制的是变量的值,而不是变量的地址。
值类型变量不能为null,必须具有一个确定的值,一般在定义时,系统会给予默认值。
值类型是从System.ValueType类继承而来的类型,下面详细介绍值类型中包含的几种数据类型。
1)整数类型
整数类型代表一种没有小数点的整数数值,在C#中内置的整数类型如表3.1所示。
表3.1 整数类型
学习手册
提示
byte类型及short类型是范围比较小的整数,如果正整数的范围没有超过65535,声明为ushort类型即可,当然更小的数值直接以byte类型作处理即可,但是使用这种类型时必须注意数值的大小,否则可能会导致运算溢出错误。
【例3.6】 创建一一个控制台应用程序,在其中声明一一个int类型的变量m,并初始化为2;声明一一个byte类型的变量n,并初始化为23;然后计算定义的两个变量的和,并进行输出。代码如下:
程序运行结果如图3.10所示。
3.10 整数类型的使用
2)浮点类型
浮点类型主要用于处理含有小数的数值数据,它主要包含float和double两种数值类型,表3.2列出了这两种数值类型的描述信息。
表3.2 浮点类型
如果不做任何设置,包含小数点的数值都被认为是double类型,例如9.27,如果没有特别指定,这个数值的类型是double类型。如果要将数值以float类型来处理,就应该通过强制使用f或F将其指定为float类型。
学习手册
说明
在许多书中对浮点类型都有这样的叫法:double类型通常称为双精度,float类型通常称为单精度。
【例3.7】 下面的代码用来将数值强制指定为float类型:
如果要将数值强制指定为double类型,则需要使用d或D进行设置。
【例3.8】 下面的代码用来将数值强制指定为double类型:
double m = 927d; //使用d强制指定为double类型
double n = 112D;//使用D强制指定为double类型
学习手册
注意
在程序中使用float类型时,必须在数值的后面跟随f或F,否则编译器会直接将其作为double类型处理。
3)布尔类型
布尔类型主要用来表示true/false值,一个布尔类型的变量,其值只能是true或者false,不能将其他值指定给布尔类型变量,布尔类型变量不能与其他类型进行转换。
【例3.9】 创建一一个控制台应用程序,在其中声明一一个bool类型的变量bl,并初始化为false;然后在控制台中输入两个数,并通过比较两个数的大小来重新为bool类型的变量赋值;最后输出bool类型变量的值。代码如下:
程序运行结果如图3.11所示。
图3.11 布尔类型的使用
学习手册
提示
布尔类型变量大多数被应用到流程控制语句当中,如循环语句或者if语句等。
引用类型是构建C#应用程序的主要数据类型,引用类型的变量也称为引用变量,可存储对实际数据的引用。在应用程序执行的过程中,引用类型使用new关键字创建对象,并存储在内存的堆中。堆是一种由系统弹性配置的内存空间,没有特定大小及存活时间,因此可以被弹性地运用于对象的访问。
引用类型具有如下特征:
必须在托管堆中为引用类型的变量分配内存。
引用类型的变量由.NET Framework的垃圾回收机制来管理。
类型相同的多个引用变量可以引用同一个对象,在这种情形下,对一个变量的操作会影响另一个变量所引用的同一对象。
引用变量被赋值前的值都是null。
在初始化新的应用程序时,“运行时”会为该应用程序保留一个连续的地址空间区域,使用托管堆维护着一个指针,用它指向在堆中分配的下一个对象的地址,因此托管堆是CLR中自动内存管理的基础。
C#支持两个预定义的引用类型,分别是object类型和string类型,详细说明如下:
object在.NET Framework中是object类型的别名。在C#的统一类型系统中,所有类型(预定义类型、用户定义类型、引用类型和值类型)都是直接或间接继承自object类型。
string类型表示零或更多Unicode字符组成的序列。
学习说明手册尽管string是引用类型,但如果用到了相等运算符(==和!=),则表示比较string对象(而不是引用)的值。
所有被称为“类”的都是引用类型,主要包括类(class)、接口(interface)、数组(array)和委托(delegate)等。下面通过一个实例来演示如何使用引用类型。
【例3.10】 创建一一个控制台应用程序,在其中创建一一个类SampleClass,在此类中声明一一个int类型的变量,并初始化为10,然后在程序的其他位置通过new关键字创建此类的引用类型变量进行使用,最后输出引用变量的值。代码如下:
程序运行结果如图3.12所示。
图3.12 引用类型的使用