2010-08-10 45 views
8

我得到了下面的代码:装箱和拆箱,为什么输出都不是“System.Object”?

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

输出是:

System.Int32 
System.Object 

他们为什么不都System.Object

+0

@Also OP,Console.WriteLines都可以工作,即使没有显式的ToString() - 如果你的参数会被隐式调用类型是一个对象。 – Gishu 2010-08-10 09:23:06

+0

删除了称呼:“提前致谢”,也删除了标题中的非法单词:“关于”的问题,下次不要这样做 – 2015-05-18 18:57:37

回答

4

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

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

  • 当移到堆,创建一个新的对象 - 其类型的指针设置为原始值类型的Type对象(这里系统。 INT32)。这解释了GetType()(以及如果尝试将其取消装箱到不同类型时出现错误)。
  • 然后将实际值复制到此对象中。
7

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

即使您的变量被声明为object,它实际上是拿着一个盒装的Int32实例。

+0

我不知道其他答案试图证明什么:) – leppie 2010-08-10 09:12:34

+1

我认为他的问题为什么盒子的GetType(对象)返回Int32(盒装值的类型)而不是Object - 因为装箱会导致它在堆上创建一个对象。如果没有,你会得到一个+1 – Gishu 2010-08-10 09:14:00

+0

@leppie:肯定有很多,不在那里:) – 2010-08-10 10:10:36

3

忽略拳击的话题,所有的类都从类型对象继承。对于参考类型和值类型都是如此。 GetType显示最派生的类型,在这种情况下是System.Int32。

其中几次的GetType是否会返回一个System.Object的是,如果你这样做:

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

拳击是指当值类型是引用类型被指。通常这是作为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

+0

值类型并不真正从Object派生。它们完全在类型层次结构之外。然而,对于每个值类型,都有一个类型类型,它来自具有讽刺名称的ValueType(尽管它的名称是类类型)。系统在每个值类型及其相应的自动生成的类类型之间定义隐式双向转换运算符。从值类型到类类型的隐式转换称为“装箱”;反向转换是“拆箱”。 – supercat 2011-09-13 06:52:16

+0

@supercat:随意编辑答案,如果你想:) – 2011-09-13 07:20:55

1

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

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

将不会返回System.Object无论是。

+0

它将返回实例的类型,而不是参考的类型 – 2010-08-10 09:01:14

1

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

类似的,如果你有

class a 
{ 
} 

class b : a 

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

调用bInstance.GetType()不知道该变量被宣布为“A”型的方式,我不认为你希望它返回“一个'在这种情况下。然而在上面的例子中,a是我对象的缩写,而b是System.Int32

相关问题