C# 引用类型和值类型

C# 引用类型和值类型

CLR支持两种类型:引用类型和值类型。

1.引用类型

(1)内存必须从托管堆上分配;

(2)堆上分配的每个对象都有一些额外成员(包括“类型对象指针”,“同步块索引”),这些成员必须初始化;

(3)对象的其他字节总是设为零;

(4)从托管堆分配对象时,可能强制执行一次垃圾回收。

2.值类型

(1)一般在线程栈上分配;

(2)不受垃圾回收器控制;

3.两者的区别

(1)值类型的两种表示形式:未装箱和已装箱,引用类型都是已装箱;

(2)值类型从System.ValueType派生,提供了与System.Object相同的方法,但是重写了Equals和GetHashCode方法;

(3)由于值类型不能作为基类型,所以不应在值类型中使用虚方法;

(4)引用类型包含堆中对象的地址,默认为null;

(5)将值类型变量赋值给另外一个值类型变量,会复制每个字段的值,而引用类型则只复制内存地址,所以改变值类型的复制对象不会影响原值,但是引用类型会改变原值;

(6)由于未封装的值类型不在堆上分配,如果分配后该类型的事例不再活动,其内存就会被释放。

4.装箱

定义:将值类型转换成引用类型。

(1):在堆内存中分配值类型各字段所需的内存加上额外成员(类型对象指针和同步块索引)所需的内存;

(2):值类型的字段复制到新分配的对内存;

(3):返回对象地址。

5.拆箱

定义:将引用类型转换为值类型。

(1):获取已装箱事例的各字段值;

(2):将字段包含的值从堆复制到栈的值类型。

注意:

(1):如果已装箱事例的引用为null,抛出NullReferenceException异常;

(2):如果引用的对象不是所需值类型的已装箱实例,抛出InvalidCastException异常。

例如:

1 public static void Main()
2 {
3      Int32 x = 5;
4      Object o = x;   
5      Int64 y = (Int64) (Int32) o;
6 }
原文地址:https://www.cnblogs.com/Johar/p/5597718.html