2009-11-24 126 views
8

在此尋求澄清......值類型(Integer,Decimal,Boolean等)是否從Object繼承?

我聽說.NET中的'一切'從Object繼承。我也聽說過,值類型和引用類型之間的區別在於引用類型繼承自Object,而值類型不會。我的理解是,一切都是一個對象(從System.Object繼承);但是價值類型和參考類型彼此之間只是「不同」。值類型在堆棧上分配,引用類型在Stack上放置一個指針,指向堆上的地址。

這是它的要義嗎?什麼使Integer成爲值類型?這是語言中固有的東西?

+0

「是什麼讓一個整數值類型「 - CLR」知道「原始值類型,並專門處理它們,它不是語言中固有的(例如C#) – Roman 2009-11-24 22:30:55

+3

值類型不一定分配在堆棧上。考慮類中的值類型字段 - 該類的實例將在堆上,因此字段也是如此。實際上,整個分配問題只是一個實現細節 - 值類型具有價值語義並且沒有固有的對象標識(例如,不存在'=='),這就是它的全部。 – 2009-11-24 22:38:42

+1

可能的重複[在.net中的每個類型是否繼承自System.Object?](http://stackoverflow.com/questions/1316626/does-every-type-in​​-net-inherit-from-system-object) – nawfal 2013-05-27 06:18:30

回答

17

值類型,如Int32,是結構。

從VS 2008 C#幫助文件(因爲我已經打開它)對結構:

一個結構不能從另一個結構或類繼承,而且不能是一個類的基礎。所有結構都直接從繼承自System.Object的System.ValueType繼承。

+3

http://msdn.microsoft.com/en-us/library/ah19swz4(VS.71).aspx – 2009-11-24 22:27:49

3

值類型也從Object繼承,但不是直接。它們繼承自ValueType,繼而繼承Object

+0

爲獲得downvote的動機很好,這樣可以糾正任何錯誤。 – 2009-11-24 22:38:31

2

總之,並非所有的東西都來自object,但也有例外。這篇來自Eric Lippert的博客文章可能是此主題的最佳參考:"Not everything derives from object"

全部struct隱含地從System.ValueType派生。

值類型和引用類型之間的差異是一個語義問題:值類型表現值語義,而引用類型表現值語義。實施細節(例如分配的位置等並不重要)。

int例如,它們是值類型,因爲它們是struct s。當然,我們將ints作爲值類型,因爲它們表示值,我們希望值語義,而不是引用語義。

+0

@Downvoter:真的嗎?在我鞭打你的男孩之前,你有一些解釋要做。 – jason 2009-11-24 22:46:36

5

根據Red Gate's .NET Reflector,它們從對象繼承(間接)。

  • 對象 - >值類型 - > INT32
  • 對象 - >值類型 - >布爾
  • 對象 - >值類型 - >十進制
  • 對象 - >值類型 - >字節
  • 對象 - >值類型 - >字符
  • 對象 - >值類型 - > UINT32

我沒有檢查其他類型,但竟被它d似乎他們做到了。我強烈建議獲取Reflector - 這是一個免費下載,它將幫助您回答關於.NET框架各個部分如何編碼的無數其他問題。有些日子我想知道沒有它我會如何生活。

約反射最大的事情是,你並不需要依靠某人的可能過期(或不正確或錯誤解釋)書面發現什麼是真正在.NET框架內 - 包括在MSDN上 - 即使是全能的微軟也沒有錯。該文檔僅爲最新修改的最新版本。直接從代碼中獲得答案是最不可能的錯誤 - 當然假設你能夠正確地插入代碼;)

2

從MSDN:(http://msdn.microsoft.com/en-us/library/s1ax56ch%28VS.71%29.aspx

值類型

的值類型包括兩個主要類別:

* Struct type 
* Enumeration type 

的結構類型包含用戶定義的結構類型和以下內置簡易型:

* Numeric types 
     o Integral types 
     o Floating-point types 
     o decimal 
* bool 

值類型的主要特徵

值類型的變量始終包含該類型的值。對值類型的變量的賦值會創建指定值的副本,而賦值給引用類型的變量會創建引用的副本,但不會創建引用對象的副本。

所有值類型都是從Object類隱式派生的。

與引用類型不同,不可能從值類型派生新的類型。但是,像引用類型一樣,結構可以實現接口。

與引用類型不同,值類型不可能包含空值。

每個值類型都有一個隱式默認構造函數,用於初始化該類型的默認值。有關值類型的默認值的信息,請參閱默認值表。

簡單類型

所有簡單類型的主要特點是.NET Framework的系統類型的別名。例如,int是System.Int32的別名。有關別名的完整列表,請參閱內置類型表。

在編譯時計算常量表達式,其操作數都是簡單類型常量。有關更多信息,請參見7.15常量表達式。

簡單類型可以使用文字初始化。例如,'A'是char類型的文字,2001是int類型的文字。

12

這取決於您如何查看術語 - 這取決於您是在討論C#還是CLI規範。例如,在CLI規範(ECMA-355)的部分8.9.8和8.9.10狀態:

值類型不繼承,雖然 相關盒裝類型是對象類型 並因此從其它繼承 類型。

在他們未裝箱形式的值類型做 沒有從任何類型的繼承。盒裝值 類型應直接繼承 System.ValueType,除非它們是 枚舉,在這種情況下,它們的 應從System.Enum繼承。盒裝 價值類型應密封。

所以從CLI的角度來看,問題的答案是no。但是,讓我們來看一下C#規範 - 並且因爲我們處於類似ECMA的心情,所以讓我們去看看那個版本(它目前停留在C#2中)。第11.1.1節規定:

所有值類型隱式地從類System.ValueType, 這反過來,從 object類繼承繼承 。

所以從C#規範的角度來看,答案是

有人可能會說你標記了你的問題「.net」,所以我們應該使用CLI定義;如果你將它標記爲「c#」,我們應該使用C#定義。看看它有多武斷? :)

雖然所有這種規格潛水都沒有多少實際用途。答案取決於錯綜複雜的定義。在重要的地方構建一些有趣的情況更加明智......那麼你想做什麼?如果您可以提供一些代碼,我們可以回答有關會發生什麼的問題 - 這比定義更重要。

(是的,這是不尋常的我 - 在一般情況下,術語是相當重要的,以我在某些情況下,但是,細微之處更是禍不是福。)

+0

男人,你需要出去更多:D – BenAlabaster 2009-11-25 02:27:05

+3

@本:「更多」表明我目​​前完全沒有;) – 2009-11-25 06:55:31

+0

大聲笑,至少你今年到DevDays有一次出遊;) – BenAlabaster 2009-11-25 14:38:02

相關問題