在此尋求澄清......值類型(Integer,Decimal,Boolean等)是否從Object繼承?
我聽說.NET中的'一切'從Object繼承。我也聽說過,值類型和引用類型之間的區別在於引用類型繼承自Object,而值類型不會。我的理解是,一切都是一個對象(從System.Object繼承);但是價值類型和參考類型彼此之間只是「不同」。值類型在堆棧上分配,引用類型在Stack上放置一個指針,指向堆上的地址。
這是它的要義嗎?什麼使Integer成爲值類型?這是語言中固有的東西?
在此尋求澄清......值類型(Integer,Decimal,Boolean等)是否從Object繼承?
我聽說.NET中的'一切'從Object繼承。我也聽說過,值類型和引用類型之間的區別在於引用類型繼承自Object,而值類型不會。我的理解是,一切都是一個對象(從System.Object繼承);但是價值類型和參考類型彼此之間只是「不同」。值類型在堆棧上分配,引用類型在Stack上放置一個指針,指向堆上的地址。
這是它的要義嗎?什麼使Integer成爲值類型?這是語言中固有的東西?
值類型,如Int32
,是結構。
從VS 2008 C#幫助文件(因爲我已經打開它)對結構:
一個結構不能從另一個結構或類繼承,而且不能是一個類的基礎。所有結構都直接從繼承自System.Object的System.ValueType繼承。
http://msdn.microsoft.com/en-us/library/ah19swz4(VS.71).aspx – 2009-11-24 22:27:49
值類型也從Object
繼承,但不是直接。它們繼承自ValueType
,繼而繼承Object
。
爲獲得downvote的動機很好,這樣可以糾正任何錯誤。 – 2009-11-24 22:38:31
值類型從對象
...但not everything in .net inherits from object繼承(間接地)。
總之,並非所有的東西都來自object
,但也有例外。這篇來自Eric Lippert的博客文章可能是此主題的最佳參考:"Not everything derives from object"
全部struct
隱含地從System.ValueType
派生。
值類型和引用類型之間的差異是一個語義問題:值類型表現值語義,而引用類型表現值語義。實施細節(例如分配的位置等並不重要)。
int
例如,它們是值類型,因爲它們是struct
s。當然,我們將int
s作爲值類型,因爲它們表示值,我們希望值語義,而不是引用語義。
@Downvoter:真的嗎?在我鞭打你的男孩之前,你有一些解釋要做。 – jason 2009-11-24 22:46:36
根據Red Gate's .NET Reflector,它們從對象繼承(間接)。
我沒有檢查其他類型,但竟被它d似乎他們做到了。我強烈建議獲取Reflector - 這是一個免費下載,它將幫助您回答關於.NET框架各個部分如何編碼的無數其他問題。有些日子我想知道沒有它我會如何生活。
約反射最大的事情是,你並不需要依靠某人的可能過期(或不正確或錯誤解釋)書面發現什麼是真正去在.NET框架內 - 包括在MSDN上 - 即使是全能的微軟也沒有錯。該文檔僅爲最新修改的最新版本。直接從代碼中獲得答案是最不可能的錯誤 - 當然假設你能夠正確地插入代碼;)
是的,值類型從Object繼承。
見繼承層次節在這裏:http://msdn.microsoft.com/en-us/library/system.valuetype.aspx
的說明在同一頁節說,從字面上看:
參考和值類型是從最終的基類派生 對象。
@Downvoter:如果您贊成,歡迎發表評論。謝謝。 – CesarGon 2009-11-24 22:38:36
從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類型的文字。
這取決於您如何查看術語 - 這取決於您是在討論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#定義。看看它有多武斷? :)
雖然所有這種規格潛水都沒有多少實際用途。答案取決於錯綜複雜的定義。在重要的地方構建一些有趣的情況更加明智......那麼你想做什麼?如果您可以提供一些代碼,我們可以回答有關會發生什麼的問題 - 這比定義更重要。
(是的,這是不尋常的我 - 在一般情況下,術語是相當重要的,以我在某些情況下,但是,細微之處更是禍不是福。)
男人,你需要出去更多:D – BenAlabaster 2009-11-25 02:27:05
@本:「更多」表明我目前完全沒有;) – 2009-11-25 06:55:31
大聲笑,至少你今年到DevDays有一次出遊;) – BenAlabaster 2009-11-25 14:38:02
「是什麼讓一個整數值類型「 - CLR」知道「原始值類型,並專門處理它們,它不是語言中固有的(例如C#) – Roman 2009-11-24 22:30:55
值類型不一定分配在堆棧上。考慮類中的值類型字段 - 該類的實例將在堆上,因此字段也是如此。實際上,整個分配問題只是一個實現細節 - 值類型具有價值語義並且沒有固有的對象標識(例如,不存在'=='),這就是它的全部。 – 2009-11-24 22:38:42
可能的重複[在.net中的每個類型是否繼承自System.Object?](http://stackoverflow.com/questions/1316626/does-every-type-in-net-inherit-from-system-object) – nawfal 2013-05-27 06:18:30