1.值类型继承自System.ValueType;引用类型继承自System.Object,
System.ValueType继承自System.Object,所以所有值类型可以转换为相应 的引用类型,这一过程称为装箱,但会造成性能损耗,
其过程为
- 在堆上分配值类型在栈上相应大小的空间+类型对象引用+同步块引用
- 将栈上值复制到新配的堆空间上
- 返回新堆上新对象的引用
2.如何避免装箱
- 常见场景为值类型的格式化输出
例如
//发生装箱 var str1 = $@"YOU ARE NO {1}" //都是引用类型没有装箱 var str2 = $@"YOU ARE NO {1.ToString()}"
- ArrayList这种Object容器的使用
但是自从C#2引入泛型可以解决装箱问题