CS3L16——万物之父和装箱拆箱

本章代码关键字

1
object    //所有类型(包括值类型)的基类,它是一个类(引用类型)

万物之父 object

关键字:object​,object​ 是所有类型(包括值类型)的基类,它是一个类(引用类型)
基于里氏替换原则,可以用 object​ 容器装载一切类型的变量

作用:

  1. 可以利用里氏替换原则,用 object​ 装任意类型对象
  2. 可以用来表示不确定类型,作为函数参数类型

object​ 存储值类型(装箱),将 object​ 转为值类型(拆箱),存在拆箱装箱

  • 好处:不确定类型时可以方便参数的存储和传递
  • 坏处:存在内存迁移,增加性能消耗

因为装箱拆箱有性能损耗,所以最好慎用

object​ 自带了一些方法,详见:CS3L23——object中的方法

万物之父的使用

object​ 是所有类型的基类,包括所有值类型和引用类型
object​ 类型转换为其他类型时,可以使用 as​ 也可以使用括号强转,引用类型建议使用 as​,值类型需要使用括号强转

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
class Father { }

class Son : Father
{
public void Speak() { }
}

internal class Program
{
static void Main(string[] args)
{
//引用类型
object o = new Son();
//object可以装载任何一个对象
Son s = new Son();
o = s;
//用is as 转换
if (o is Son)
{
(o as Son).Speak();
}

//值类型
object o2 = 1;
object o3 = 2f;
//用括号强转
int i = (int)o2;
float fl = (float)o3;

//特殊的string类型
object str = "123123";
string str2 = str as string;

//数组
object arr = new int[10];
int[] ar = (int[])arr;
//但是建议使用引用类型的都使用is as方法
object arr2 = new int[10];
int[] ar2 = arr2 as int[];
}
}

装箱拆箱

发生条件:

  • object​ 存储值类型(装箱)

    1
    object obj = 1;        //装箱
  • object​ 转为值类型(拆箱)

    1
    2
    object obj = 1;        //装箱
    int i = (int)obj; //拆箱

其中:

  • 装箱:把值类型使用引用类型变量存储,栈内存会迁移到堆内存中
  • 拆箱:把引用类型存储的值类型数据取出来到值类型变量,堆内存会迁移到栈内存中

装箱拆箱的问题:

  • 好处:不确定类型时可以方便参数的存储和传递

    1
    2
    3
    4
    5
    6
    7
    8
    9
    static void Main(string[] args)
    {
    TestFun(1, 4f, 34.5, "123123", false);
    }

    static void TestFun(params object[] array)
    {
    //这样就可以确保所有类型的参数都能传进来
    }
  • 坏处:存在内存迁移,增加性能消耗,因为有性能损耗,所以最好避免

装箱拆箱常出现在函数参数传递中,后续会学习 泛型(#TODO#​) ,它可以消除大部分情况的装箱拆箱