类型的装箱和拆箱

C#使用单类层次的单一继承:所有类都继承自Object基类,而且不可能多重继承。

但是C#的接口提供了许多多重继承的功能

类型的装箱和拆箱

Boxing and Unboxing Types

装箱(boxing)和拆箱(unboxing)是使值类型(如整数)能够被当成引用类型(对象)的处理过程。值被“装箱”到一个Object里然后“拆箱”回一个值类型。正是这种处理,使我们可以像示例5-3那样,对整数调用ToString()方法。

提示:Java程序员注意了:在Java中,在对象中包装基本类型需要显式使用Interger和Float这样的包装类型。而在C#中, 装箱机制将为你自动操心这一切,不需要使用包装类型

装箱是隐含的

Boxing Is Implicit

装箱是一种隐含的转换,将值类型转成Object类型。将一个值装箱,将分配一个Object的实例,并将值复制给此实例,如图5-4所示。

 

图5-4:装箱引用类型

装箱过程是隐含的,因为对任何值类型,都会有对应的引用,值就已被隐含装箱了。例如,如果将一个基本类型(如整数)赋值给Object类型的一个变量(这是合法的,因为int是从Object派生而来的),值就被装箱了,如下所示:

using System;

class Boxing 

{

   public static void Main()

   {

      int i = 123;

      Console.WriteLine("The object value = {0}", i);

   }

}

Consolle.WriteLine()的参数是一个对象,而不是整数。为了适应这个方法,整数类型被CLR自动装箱了,并对生成的对象调用ToString()。这种功能可用来创建参数为对象的方法。无论传入的是引用类型还是值类型,方法都能工作。

拆箱必须是显式的

Unboxing Must Be Explicit

要将已装箱的对象转换回值类型,必须显式进行拆箱。分两步走:

1. 确定对象实例是给定值类型的已装箱值;

2. 从实例复制值到值类型变量。

图5-5说明了拆箱过程。

 

图5-5:装箱然后拆箱

要想拆箱成功,被拆箱的对象必须是一个对象的引用,后一对象是通过对给定类型的值装箱生成的。装箱和拆箱的编码如示例5-4所示。

示例5-4:装箱和拆箱

#region Using directives

using System;

using System.Collections.Generic;

using System.Text;

#endregion

namespace boxing

{

   public class UnboxingTest

   {

      public static void Main()

      {

         int i = 123;

         //装箱

         object o = i;

         // 拆箱(必须显式)

         int j = ( int ) o;

         Console.WriteLine( "j: {0}", j );

      }

   }

}

示例5-4创建了一个整数i,在赋值给对象o时隐式将其装箱。值然后显式拆箱,又赋给一个新的int,其值显示出来。

通常,要在try语句块中用到拆箱操作,我们会在第11章解释。如果要拆箱的对象是空值,或另一种类型对象的引用,会抛出InvalidCastException异常。

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/linzonghua234/archive/2007/12/01/1911156.aspx

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值