2010-08-10 69 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