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