什么是装箱、拆箱?
在c#中,装箱和拆箱是两种与值类型和引用类型之间相互转化的操作。
装箱:
1 | int i = 1; |
拆箱:
1 | object o = 1; |
装箱拆箱会带来额外的开销,所以我们需要尽可能避免。
如何避免?
- 使用泛型
使用List而非ArrayList或Hashtable
1 | ArrayList list = new ArrayList(); |
因为ArrayList存的是object,需要装箱,而List<T>是泛型集合,编译后其实就是List<int>,内部存的是int[]。
只要出现值类型 → object / 接口 就会装箱。
2. 对于大型结构体,使用in关键字,使其成为只读的
3. 对需要频繁装箱的对象,可以先进行缓存
1 | object boxedInt = 10; // 装箱一次 |
- c重载常用方法
对于自定义结构体,使用ToString()、GetType()等可以避免隐式装箱
1 | struct MyStruct |
因为ToString 原本定义在 System.Object 里。
所有值类型最终也都继承自 ValueType -> Object。明确了类型后,可以避免再转化为object。