5.1 编程语言的基元类型

编译器直接支持的数据类型成为基元类型(primitive type),基元类型直接映射到Framework类库(FCL)中存在的类型。

CLR.Via第三版第五章 基元类型、引用类型和值类型_程序

CLR.Via第三版第五章 基元类型、引用类型和值类型_程序_02

5.2引用类型和值类型

引用类型总是从托管推上分配的,C#的new操作符会返回对象的内存地址--即指向对象数据的内存地址。适用引用类型时,必须注意到一些性能问题

1:内存必须从托管对上分配。

2:对上分配的每个对象都有一些额外的成员,这些成员必须初始化。

3:对象中的其他字节(为字段而设)总是设为零。

4:从托管堆上分配一个对象时,可能强制执行一次垃圾收集操作。

如果所有类型都是引用类型,程序的性能将会显著下降,假设每次适用一个int32值时,都进行一次内存分配,性能会收到多么大的影响!!所以,为了提升简单的,常用的类型的性能,CLR提供了名为“值类型”的轻量级类型。

值类型一般在线程栈上分配。在代表值类型的一个变量中,并不高喊一个指向实例的指针,相反变量中包含了实例本身的字段,由于变量已经包含了实例的字段,所以为了操作实力中的字段,不再需要提领一个指针。值类型的实例不受垃圾回收器的控制,因此,值类型的使用缓解了托管堆中的压力,并减少了一个程序在其生存期内需要进行的垃圾回收次数。

在文档中查看一个类型时,任何称为“类”的类型都是引用类型。

相反,文档将所有值类型都称为结构或者枚举。

如何考虑就爱那个一个类型定义为值类型,而不是引用类型?

具体的说,除非一下所有条件都满足,否则不应将一个类型声明为值类型。

1:类型具有基元类型的行为,换言之,这是一个十分简单的类型,其中没有成员会修改类型的任何实例字段。

2:类型不需要从其他任何类型继承。

3类型也不会派生出其他任何类型。

同时还需要满足下列任何一个条件:

1:类型的实例较小(约为16字节或更小)

2:类型的实例较大(大约16字节),但不作为方法的实参传递,也不从方法返回。