1. 值类型和引用类型的区别
1)范围:
值类型:数值类型、bool型、结构、枚举、可空类型。
引用类型:字符串、自定义的类、委托、数组、接口、object
2)内存分配:
值类型:只需要一段单独的内存,用于存放实际数据。
引用类型:需要二段内存。
第一段用于存放实际数据,它始终放在堆中。
第二段用于存放数据在堆中的存放位置
3)存储位置:
数据不是其他类型的成员:值类型的数据或引用类型的引用存放在栈中,引用类型的数据存放在堆中。
数据是其他类型的成员:引用类型的数据始终放在堆中,值类型的数据或引用类型的引用根据实际情况存放。
(栈中内存是自动释放的,堆中内存是由GC来自动释放)
4)场合:
值类型不支持多态,引用类型支持多态。
值类型不可以派生出新的类型,因为值类型都是密封的。引用类型可以。
值类型不可以包含null(除外可空类型),引用类型可以。
值类型变量的赋值--复制包含的值。引用类型变量的赋值--复制对象的引用。
5)继承:
引用类型和值类型都继承自System.Object。
不同的是引用类型都直接继承System.Object,而值类型继承其子类,即System.ValueType。
关键在于ValueType重写了Equals(),从而对值类型按照实际的值比较,而不是引用地址来比较