月落网
图一是C#中简单数据类型与基类库中有关类型的对应表(其它语言也会提供类似的简单数据类型)
字串7
| C# Primitive Type | BCL Type | Description |
| sbyte | System.SByte | Signed 8-bit value |
| byte | System.Byte | Unsigned 8-bit value |
| short | System.Int16 | Signed 16-bit value |
| ushort | System.UInt16 | Unsigned 16-bit value |
| int | System.Int32 | Signed 32-bit value |
| uint | System.UInt32 | Unsigned 32-bit value |
| long | System.Int64 | Signed 64-bit value |
| ulong | System.UInt64 | Unsigned 64-bit value |
| char | System.Char | 16-bit Unicode character |
| float | System.Single | IEEE 32-bit float |
| double | System.Double | IEEE 64-bit float |
| bool | System.Boolean | A True/False value |
| decimal | System.Decimal | 96-bit signed integer times 100 through 1028 (common for financial calculations where rounding errors can't be tolerated) |
| object | System.Object | Base of all types |
| string | System.String | String type |
图 一
引用类型和数值类型
当从受管堆(managed heap)中分配对象时,new操作符返回对象的内存地址。通常将这个地址存储在一个变量当中。这种方式就是引用类型的变量,因为变量不包含实际对象的位,而是引用对象的位。
在处理引用类型时会有一些性能问题要考虑。首先,内存必须要从受管堆中分配,这样能强制垃圾回收。其次,引用类型总是通过指针来存取。所以每次引用堆中对象的成员时,为了实现期望的处理,必须要产生和执行收回指针的代码。这反而影响程序的大小和程序执行的速度。
除了引用类型外,实际的对象系统中还有轻量级的数值类型。数值类型对象不能在可回收垃圾的堆中分配,并且表示对象的变量不包含对象的指针,而是变量包含对象本身。因为变量包含着对象,处理对象也就不必考虑指针回收的问题,从而改进了性能。 yueluo.net
图二中的代码说明了引用类型和数值类型差别。Rectangle类型的声明使用了结构,而没有使用更普通的类。在C#中,使用结构声明的类型是个数值类型,而使用类声明的是引用类型。其它语言可能用不同的语法来描述数数值类型和引用类型,例如C++中使用_value修饰符。
字串9
回顾前面讨论简单类型时提到过的代码行:
字串9
System.Int32 a = new System.Int32(5);
字串6
编译这个语句时,编译器发觉System.Int32是数值类型并优化产生的中间语言(IL)代码,以便使这个“对象”不从堆中分配;而将这个对象放到线程堆栈的局部变量a中。、
可能的情况下,应该使用数值类型而不要使用引用类型,这样做可以使应用程序的性能更好。尤其是在使用以下数据类型时,你应该将变量声明为数值类型:
* 简单数据类型。
* 不需要从其它类型继承的数据类型。
* 没有任何从它派生的数据类型。
* 类型对象不会作为方法参数经常性传递,这是因为它会导致频繁的内存拷贝操作,从而损害性能。这一点在下面有关框入和框出的讨论中将作更详细的解释。
数值类型的主要优点是他们不在受管堆中进行分配。但与引用类型比较,使用数值类型也有几个局限。以下是对数值类型和引用类型的一个比较。
数值类型对象有两种表示法:框出的形式和框入的形式。引用类型对象总是表示为框入形式。
数值类型从System.ValueType类型中隐含派生。这个类型提供的方法与System.ValueType定义的方法相同。但是,System.ValueType重载Equals方法,以便在两个对象实例字段匹配时返回true。此外,System.ValueType重载GetHashCode方法,以便在对象实例字段中使用有这些值参与的算法产生hash 代码值。当定义自己的数值类型时,强烈推荐你重载并提供外部的Equals 和GetHashCode方法实现。