.NET面试准备(四)——基元类型 值类型 引用类型

一、基元类型

  • 编译器直接支持的数据类型
  • 基元类型直接映射到FCL(Framework 类库)中存在的类型
  • 例:c#的int映射到System.Int32

二、引用类型与值类型

1.值类型

Q:为什么有值类型
A:引用类型总是从托管堆分配,如果所有类型都是引用类型,应用程序的性能将会显著下降,所以CLR提供了轻量级类型:值类型。

  • 值类型的实例一般在线程栈上分配
  • 值类型变量直接包含它的数据,不需要指向实例的指针,不受CG控制

值类型主要包括两种类型:结构枚举

  1. 数值类型
  2. bool 类型
  3. char类型
  4. 用户自定义结构

值类型的特点

  1. 都直接或间接派生自System.ValueType
  2. 值类型是隐式密封的,既不能派生,也不能继承,为了防止将值类型作为其他引用类型的基类型
  3. 每种值类型都有一个默认的构造器来初始化默认值

什么情况适合将类型设为值类型

  • 类型具有基元类型的行为。
  • 类型不需要继承,也不需要派生
  • 类型的实例字段较小(16字节或更小)
  • 类型的实例较大,但不作为方法实参传递,也不从方法返回

值类型与引用类型的区别:

  • 值类型对象有两种表示形式:未装箱和已装箱;引用类型总是处于已装箱形式
  • 由于不能将值类型作为基类型来定义新的值类型和引用类型,所以不应在值类型中引入任何新的虚方法
  • 将值类型变量赋给另一个值类型变量,会执行逐字段的复制。将引用类型的变量赋给另一个引用类型的变量只复制内存地址

参数—按引用类型传递

out 与 ref,

  • 都指示编译器传递参数地址
  • ref 要求参数在使用之前要显式初始化,out要在方法内存初始化
  • out与ref都不能重载

在这里插入图片描述

三、dynamic基元类型

程序需要处理一些运行时才会知晓的信息。
dynamic编译后,是一个object类型,编译期间不进行类型检查,将类型检查放到了运行期

猜你喜欢

转载自blog.csdn.net/hhhhhhenrik/article/details/93655892