一、基元类型
- 编译器直接支持的数据类型
- 基元类型直接映射到FCL(Framework 类库)中存在的类型
- 例:c#的int映射到System.Int32
二、引用类型与值类型
1.值类型
Q:为什么有值类型
A:引用类型总是从托管堆分配,如果所有类型都是引用类型,应用程序的性能将会显著下降,所以CLR提供了轻量级类型:值类型。
- 值类型的实例一般在线程栈上分配
- 值类型变量直接包含它的数据,不需要指向实例的指针,不受CG控制
值类型主要包括两种类型:结构和枚举:
- 数值类型
- bool 类型
- char类型
- 用户自定义结构
值类型的特点:
- 都直接或间接派生自System.ValueType
- 值类型是隐式密封的,既不能派生,也不能继承,为了防止将值类型作为其他引用类型的基类型
- 每种值类型都有一个默认的构造器来初始化默认值
什么情况适合将类型设为值类型
- 类型具有基元类型的行为。
- 类型不需要继承,也不需要派生
- 类型的实例字段较小(16字节或更小)
- 类型的实例较大,但不作为方法实参传递,也不从方法返回
值类型与引用类型的区别:
- 值类型对象有两种表示形式:未装箱和已装箱;引用类型总是处于已装箱形式
- 由于不能将值类型作为基类型来定义新的值类型和引用类型,所以不应在值类型中引入任何新的虚方法
- 将值类型变量赋给另一个值类型变量,会执行逐字段的复制。将引用类型的变量赋给另一个引用类型的变量只复制内存地址
参数—按引用类型传递:
out 与 ref,
- 都指示编译器传递参数地址
- ref 要求参数在使用之前要显式初始化,out要在方法内存初始化
- out与ref都不能重载
三、dynamic基元类型
程序需要处理一些运行时才会知晓的信息。
dynamic编译后,是一个object类型,编译期间不进行类型检查,将类型检查放到了运行期