.NET的膽內,對於含有某些成員結構的定義是一樣的,其對於那些相同的字段和成員的類的定義,並且其從System.ValueType
繼承。請注意,編譯器將不允許聲明繼承ValueType
的class
,但是當聲明struct
時,編譯器「幕後」聲明瞭一個類。
什麼使.net中的值類型特殊是運行時分配存儲位置(變量,字段,參數等)的方式當聲明不從ValueType
繼承的類型的存儲位置時,運行時將分配堆對象引用的空間。相比之下,當聲明從ValueType
繼承的類型的存儲位置時,運行時將爲該類型的所有公用和專用字段分配空間。對於像int
這樣的類型,系統在正常類型系統之外分配一個特殊基本類型的專用字段。
請注意,值類型的存儲位置並不真正包含該類型的實例;而不是是該類型的一個實例,而則包含該類型的所有字段。像struct1 = struct2
這樣的語句不會用實例struct2
替代值類型實例struct1
。相反,它會將struct2
中的所有字段複製到struct1
的相應字段中。同樣,如果將值類型的存儲位置作爲方法傳遞給過程而不使用關鍵字ref
,則傳遞的內容不是結構實例本身,而是其字段內容。
如果有必要的值型存儲位置複製到不從ValueType
(例如Object
或IComparable
),系統將創建值類型的新堆對象實例派生類型的一個,複製所有字段從值類型添加到新實例,並將對該新實例的引用存儲在目標存儲位置中。這個過程被稱爲「拳擊」。大多數編譯器會隱式地執行此操作,因此試圖表現得好像值類型的存儲位置持有來自ValueType
的對象。不過,需要注意的是,這是一種幻覺。如果類型X
從Y
派生,一個有一個名爲xx
的X
和一個名爲yy
Y
,和一個執行xx = yy
,這樣的說法應該引起xx
和yy
指同一個對象實例。如果xx
和yy
不是從ValueType
派生的類型,即使yy
包含從ValueType
派生的某個事件的實例,也會發生這種情況。但是,如果xx
和/或yy
來自ValueType
,則不會發生。在這種情況下,系統會將字段從一個實例複製到另一個實例(可能是新實例)。
重複? http://stackoverflow.com/questions/10727151/if-a-struct-cannot-inherit-another-class-or-struct-why-does-int32-have-a-tostri – Jake1164
@ Jake1164是的,這傢伙是基本上問我同樣的問題!我的錯! – JMK