簡體   English   中英

當它是引用類型的字段時是值類型裝箱嗎?

[英]Is value type boxing when it is a field of reference type?

有代碼:

struct A
{
   int b;
}

class B
{
  A a;
  int b;
}

問題是:

  1. 是B盒裝還是不盒裝?
  2. B中是否位於堆棧或堆中?
  3. b是否是A盒裝?
  4. b是在堆棧中還是在堆中?
  5. 是B盒裝或不裝箱?
  6. b是B堆棧還是堆棧?

我真的不明白它:(

1)不,這里沒有拳擊。

2) a將在堆上,盡管這是一個實現細節

3)否, A中的b不是盒裝的

4) A b將存在於包含A (因此,使用類型A的局部變量,它通常位於堆棧上;使用類似B的實例變量或任何靜態變量,它將打開堆); 再次,這是一個實現細節

5) b中的B也沒有加框

6) b中的B將在堆上 - 再次,一個實現細節

這里沒有拳擊,因為你沒有顯示任何試圖使用值類型值作為引用類型值(例如object或接口)的東西。

同樣,整個堆棧/堆的區別是一個實現細節。 您應該閱讀Eric Lippert 關於該主題博客文章

使用Google我發現了這個

拳擊和拆箱是C#類型系統中的一個基本概念。 使用Boxing和unboxing,可以通過允許將value-type的任何值轉換為類型對象和從類型對象轉換來在值類型和引用類型之間進行鏈接。 裝箱和拆箱可以實現類型系統的統一視圖,其中任何類型的值最終都可以被視為對象。 將值類型轉換為引用類型稱為Boxing。 拆箱是一項明確的操作

拳擊正在將值類型轉換為引用,並且不在您的代碼中。 所以回答你的“b-boxed”問題是“不”。

  1. B中的成員沒有裝箱。
  2. B中的成員位於堆上。 它是對象的一部分,對象總是在堆上分配。
  3. A中的b成員未加框(但A值可以加框)。
  4. A中的b成員是A的一部分,因此它存儲在A值存儲的任何位置,可以在堆棧上或堆上。
  5. B中的b成員未加框。
  6. B中的b成員位於堆上,作為對象的一部分。

通過引用傳遞值類型也不是裝箱。

void SomeFunction(ref int a) a未加框。

int? value int? value Nullable值類型也沒有裝箱。

object my_box = my_integer my_value是my_integer的盒裝版本

類中包含的值類型不是盒裝的(如果是這種情況,它何時會是值類型?)

, all of the fields--public and private--of that type. 的結構類型的存儲位置(變量,參數,或場)成立時, ,所有字段-公共和私人-該類型的。 如果存儲位置作為自動變量或參數保存在堆棧上,則其所有字段都是相同的。 . 如果存儲位置存在於堆對象中,則其字段將位於

拳擊在內部通過為每個值類型定義具有相同名稱和成員的類類型來工作。 當為需要類類型的代碼提供值類型值時,系統會生成同名類類型的新實例,並將所有字段(public和private)從value-type值復制到新對象實例。 盡管C#規范將盒裝實例描述為值類型,但其行為和內部工作方式將是類類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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