值类型与引用类型

引用类型

  • 内存必须从托管堆分配
  • 堆上分配的每个对象都有一些额外成员,这些成员必须初始化
  • 对象中的其他字节总是设为零
  • 从托管堆分配对象时,可能强制执行一次垃圾回收

值类型

  • 类型具有基元类型的行为
  • 类型不需要从其他任何类型继承
  • 类型也不派生出其他类型
  • 类型的实例较小(小于等于16字节)
  • 类型的实例较大(大于16字节),但不作为方法实参传递,也不从方法返回.
  • 不作为对象在托管堆上分配

值类型和引用类型的一些区别

  • 值类型对象有两种表示形式:未装箱和已装箱,引用类型总是处于已装箱形式
  • 值类型从System.ValueType派生,System.ValueType重写了Equals方法和GetHashCode方法,所以定义自己的值类型时,应重写Equals方法和GetHashCode方法,并提供它们的显示实现.
  • 由于不能将值类型作为基类型来定义新的值类型和引用类型,所以不应再值类型中引入任何新的虚方法.所有方法都不能是抽象的,都隐式密封.
  • 引用类型的变量包含堆中对象的地址,创建时默认初始化为null,表示当前不指向有效对象,试图使用null的引用类型变量会抛出NullReferenceException异常;值类型的变量总是包含其基础类型的一个值,初始化为0,一般不会抛出NullReferenceException异常.
  • 值类型变量赋值到另一个值类型变量,会逐字段复制,引用类型赋值只复制内存地址
  • 两个或多个引用类型变量能引用堆中同一个对象,对一个变量执行的操作可能对影响另一个变量引用的对象,值类型之间不会互相影响.
  • 由于未装箱的值类型不在堆上分配,一旦定义了该类型的一个实例方法不再活动,为它们分配的存储就会被释放,而不是等着进行垃圾回收

值类型与引用类型
http://blog.chcaty.cn/2019/03/28/zhi-lei-xing-yu-yin-yong-lei-xing/
作者
caty
发布于
2019年3月28日
许可协议