CS3L16——万物之父和装箱拆箱
CS3L16——万物之父和装箱拆箱
本章代码关键字
1 | object //所有类型(包括值类型)的基类,它是一个类(引用类型) |
万物之父 object
关键字:object
,object
是所有类型(包括值类型)的基类,它是一个类(引用类型)
基于里氏替换原则,可以用 object
容器装载一切类型的变量
作用:
- 可以利用里氏替换原则,用
object
装任意类型对象 - 可以用来表示不确定类型,作为函数参数类型
用 object
存储值类型(装箱),将 object
转为值类型(拆箱),存在拆箱装箱
- 好处:不确定类型时可以方便参数的存储和传递
- 坏处:存在内存迁移,增加性能消耗
因为装箱拆箱有性能损耗,所以最好慎用
object
自带了一些方法,详见:CS3L23——object中的方法
万物之父的使用
object
是所有类型的基类,包括所有值类型和引用类型
将 object
类型转换为其他类型时,可以使用 as 也可以使用括号强转,引用类型建议使用 as
,值类型需要使用括号强转
1 | class Father { } |
装箱拆箱
发生条件:
-
用
object
存储值类型(装箱)1
object obj = 1; //装箱
-
将
object
转为值类型(拆箱)1
2object obj = 1; //装箱
int i = (int)obj; //拆箱
其中:
- 装箱:把值类型使用引用类型变量存储,栈内存会迁移到堆内存中
- 拆箱:把引用类型存储的值类型数据取出来到值类型变量,堆内存会迁移到栈内存中
装箱拆箱的问题:
-
好处:不确定类型时可以方便参数的存储和传递
1
2
3
4
5
6
7
8
9static void Main(string[] args)
{
TestFun(1, 4f, 34.5, "123123", false);
}
static void TestFun(params object[] array)
{
//这样就可以确保所有类型的参数都能传进来
} -
坏处:存在内存迁移,增加性能消耗,因为有性能损耗,所以最好避免
装箱拆箱常出现在函数参数传递中,后续会学习 泛型(#TODO#) ,它可以消除大部分情况的装箱拆箱
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 文KRIFE齐的博客!