装箱和拆箱,为什么输出都不是“System.Object”?

时间:2010-08-10 08:50:54

标签: c# .net boxing unboxing

我收到了以下代码:

object var3 = 3;
Console.WriteLine(var3.GetType().ToString());
Console.WriteLine(typeof(object).ToString());

输出结果为:

System.Int32
System.Object

为什么他们不是System.Object

5 个答案:

答案 0 :(得分:7)

GetType()函数返回变量中实例的实际类型。

即使您的变量声明为object,它实际上持有一个盒装Int32实例。

答案 1 :(得分:4)

如果你问为什么boxedObject.GetType()没有返回Object .. 检查MSDN Boxing and Unboxing page上“拳击转换”部分下的图像。好问题btw ..至少我对你的问题的理解。

虽然技术上可能不正确,但看起来像是

  • 当移动到堆时,会创建一个新对象 - 将其Type指针设置为原始值类型的Type对象(此处为System.Int32)。这解释了GetType()(如果您尝试将其拆分为其他类型,也会出现错误)。
  • 然后将实际值复制到此对象中。

答案 2 :(得分:3)

忽略拳击主题,所有类都继承自类型对象。对于引用类型和值类型都是如此。 GetType显示派生类型最多,在本例中为System.Int32。

如果你这样做,GetType将返回System.Object的少数几次之一:

object var = new Object();
Console.WriteLine(var.GetType().ToString());

Boxing是指引用类型指向值类型的时间。通常,这是作为System.Object引用完成的。 TypeOf将返回派生最多的实际类型,而不是引用类型。

class A
{
}

class B : A
{
}

class C : B
{
}

object obj1 = new ClassA();
ClassB obj2 = new ClassB();
ClassB obj3 = new ClassC();

GetType将为这些类型执行类似的操作。

System.Console.WriteLine(obj1.GetType().ToString());
System.Console.WriteLine(obj2.GetType().ToString());
System.Console.WriteLine(obj3.GetType().ToString());
  

ClassA的
ClassB的
ClassC

答案 3 :(得分:1)

这不是真的关于拳击;这是关于GetType的行为。它返回变量的的类型,而不是变量声明的类型:

    object var4 = new List<string>();
    Console.WriteLine(var4.GetType().ToString());

也不会返回System.Object

答案 4 :(得分:1)

变量的声明是仅编译时间信息,而方法执行是运行时。换句话说,GetType()无法知道对象被声明的类型,因为它只能在运行时知道对象的实际类型。

如果你有

class a
{
}

class b : a

a bInstance = new b();
bInstance.GetType();

对bInstance.GetType()的调用无法知道变量被声明为类型'a',我认为你不希望它在这种情况下返回'a'。但是在上面的例子中,a是我的对象缩写,b是System.Int32