先放上一个图表示值类型和引用类型的所有数据类型:

img

(1)最根本的一个区别:值类型的变量直接存储数据,将数据存储在栈中。而引用类型的变量持有的是数据的引用,数据存储在堆中(对其的实例引用存储在栈中)(面试碰到的话后续还可以引申栈和堆的一些区别,比如GC标记压缩的垃圾回收方法等等)。

(2)同时对于struct(值类型)和class(引用类型)来说,struct和class都可以实现接口(函数),但是struct在赋值时(如struct s1=s2)会直接创建s2的副本并赋值给s1,而对于class赋值时(class c1=c2)时会将两个类指向同一个引用,后续操作会同时改变同一个堆中实例。

(3)所有的值类型都继承System.ValueType,引用类型继承自System.Object。(其实引用类型和值类型都继承自System.Object类,不同的是,几乎所有的引用类型都直接从System.Object继承,而值类型则继承其子类,即直接继承System.ValueType)

△ 如果一个值类型被声明在一个方法体外并且在一个引用类型中,那它就会在堆上进行分配。