簡體   English   中英

可以從c#中的類派生結構嗎?

[英]can a struct be derived from a class in c#?

結構可以從c#中的類派生嗎?

如果沒有,為什么原始數據類型(如int)可以從類object派生? 由於數據類型int基本上是結構類型(值類型)。

這僅僅是規則的例外嗎?

整數和其他值類型(例如bool)是對象,因為它允許它們利用繼承(即它們可以訪問公共.Equals() .GetType() .Equals() .GetType() .ToString()函數)。

這是.NET框架中的設計決策。 它們不是為System.ValueType下的所有值類型編寫單獨的函數,而是使用公共代碼庫。

Microsof關於類型的文檔

所有結構都繼承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); 實際上涉及三種事情:

  1. 一個未命名的臨時存儲位置,類型為`System.Drawing.Point(3,4)`,它保存該類型的私有字段(兩個整數),並初始化為(3,4)。 請注意,此存儲位置不包含“對象”; 它包含兩個整數,編譯器知道它們代表它的字段。
  2. 一個類型為`System.Drawing.Point`的堆對象。 因為這是一個堆對象,所以它繼承自`System.Object`,所有堆對象都是如此。
  3. “對象”類型的存儲位置,由變量名稱“Foo”表示。

所有這些的結果是,雖然值類型可以定義為從繼承自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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM