位置:首页 > 软件操作教程 > 编程开发 > C# > 问题详情

C# 封箱和拆箱

提问人:刘团圆发布时间:2020-12-07

    封箱(boxing)是把值类型转换为System.Object类型,或者转换为由值类型实现的接口类型。拆箱(unboxing)是相反的转换过程。

例如,下面的结构类型:

struct MyStruct 

{

    public int Val;

}

可以把这种类型的结构放在object类型的变量中,对其封箱:

    MyStruct valTypel = new MyStruct();

    valTypel.Val = 5;

    object refType = valTypel?

其中创建了一个类型为MyStruct的新变量valTypel,并把一个值赋予这个结构的Val成员,然后把它封箱在object类型的变量refType中。

以这种方式封箱变量而创建的对象,会包含值类型变量的一个副本的引用,而不包含源值类型变量的引用。要进行验证,可以修改源结构的内容,然后把对象中包含的结构拆箱到新变量中,并检査其内容:

    valTypel.Val = 6;

    MyStruct valType2 = (MyStruct)refType;

    WriteLine {$uvalType2 .Val = {valType2 .Val}");

执行这段代码将得到如下输出结果:

    valType2.Val = 5

但在把一个引用类型赋予对象时,将执行不同的操作。把MyStruct改为一个类(不考虑这个类名不合适的情况),即可看到这种情形:

class MyStruct

{

    public int Val;

}

如果不修改上面的客户代码(再次忽略名称有误的变量),就会得到如下输出结果:

    valType2.Val = 6

也可以把值类型封箱到接口类型中,只要它们实现这个接口即可。例如,假定MyStruct类型实现IMylnterface接口,如下所示:

    interface IMylnterface {}

    struct MyStruct : IMylnterface 

    {

        public int Val;

    }

接着把结构封箱到一个IMylnterface类型中,如下所示:

    MyStruct valTypel = new MyStruct ();

    IMylnterface refType = valTypel;

然后使用一般的数据类型转换语法对其拆箱:

    MyStruct ValType2 = {MyStruct)refType;

    从这些示例中可以看出,封箱是在没有用户干涉的情况下进行的(即不需要编写任何代码),但拆箱一个值需要进行显式转换,即需要进行数据类型转换(封箱是隐式的,所以不需要进行数据类型转换)。

    读者可能想知道为什么要这么做。封箱非常有用,有两个非常重要的原因。首先,它允许在项的类型是object的集合(如ArrayList)中使用值类型。其次,有一个内部机制允许在值类型(例如int和结构)上调用object方法。 

    最后需要注意的是,在访问值类型内容前,必须进行拆箱。

继续查找其他问题的答案?

相关视频回答
回复(0)
返回顶部