[英]can a struct be derived from a class in c#?
結構可以從c#中的類派生嗎?
如果沒有,為什么原始數據類型(如int)可以從類object
派生? 由於數據類型int基本上是結構類型(值類型)。
這僅僅是規則的例外嗎?
整數和其他值類型(例如bool)是對象,因為它允許它們利用繼承(即它們可以訪問公共.Equals()
.GetType()
.Equals()
.GetType()
.ToString()
函數)。
這是.NET框架中的設計決策。 它們不是為System.ValueType下的所有值類型編寫單獨的函數,而是使用公共代碼庫。
所有結構都繼承System.ValueType
,而System.ValueType
又繼承Object
。
你不能改變它。
當運行時為類型分配存儲位置或生成代碼以對其進行操作時,它會檢查類型是否派生自System.ValueType
但不是System.ValueType
本身。 除非存儲位置滿足這些條件,否則它將保存堆對象引用,並且對其成員(字段,方法,屬性等)進行操作的任何代碼將對引用的對象起作用。 否則,存儲位置將保存該類型的所有公共和私有字段(將在該類型的所有存儲位置中相同地布置),並且對其成員進行操作的任何代碼將在存儲位置本身上操作。
如果嘗試將值類型存儲到ValueType
類的存儲位置,或者存儲位置不是從ValueType
派生,則系統將生成存儲位置類型的新堆對象,然后存儲對該類型的引用對象在適當的存儲位置。 雖然從System.ValueType
派生的類型的存儲位置和訪問它們的代碼由運行時特別處理,但是從System.ValueType
繼承的堆對象實例(例如剛剛提到的新創建的實例)只是堆對象碰巧派生自System.ValueType
,並且具有與其他類型基本相同的繼承行為,因此可能由期望處理堆引用的代碼傳遞。
Object Foo = New System.Drawing.Point(3,4);
類的語句Object Foo = New System.Drawing.Point(3,4);
實際上涉及三種事情:
所有這些的結果是,雖然值類型可以定義為從繼承自Object
ValueType
繼承,而類型繼承自ValueType
堆對象繼承自Object
,但值類型的存儲位置不包含從Object
繼承的東西。
類層次結構的工作原理如下(簡化):
Object - > ValueType - > int Object - > ValueType - > struct
根據c#的定義,結構不允許繼承。
這是一篇很好的文章,描述了st#在C#語言中的作用:
http://msdn.microsoft.com/en-us/library/aa288471(v=vs.71).aspx
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.