簡體   English   中英

訪問存儲在動態對象中的對象的值類型屬性時,是否會導致將這些屬性的值裝箱?

[英]When accessing value-type properties of an object stored in a dynamic, does it cause boxing of those properties' values?

考慮以下代碼...

public class ValueHolder<T>
{
    public T HeldValue{ get; set; }
}

在此處分配x時,當然沒有裝箱。

var intValueHolder = new ValueHolder<int>(){ HeldValue = 44 };
int x = intValueHolder.HeldValue;

但是,在這種情況下,將ValueHolder存儲在動態中又該怎么辦呢? 將HeldValue分配給y時有拳擊嗎?

dynamic dynamicValueHolder = new ValueHolder<int>(){ HeldValue = 44 };
int y = dynamicValueHolder.HeldValue;

我不確定確切的動態成員解析機制是什么,所以我不確定如何檢查這一點。

注意

不在動態中存儲值類型,所以這樣的例子...

dynamic x = 44; // 44 is boxed

...不是我要的。 在我的示例中,我將對象存儲在動態對象中,因此不需要裝箱,但是當我訪問該對象上的value-type屬性時, 該value-type屬性是否裝箱了? 希望這可以弄清我在這里的情況。

我引用 msdn文檔:

“在大多數情況下,動態類型的行為類似於類型對象。但是,包含動態類型的表達式的操作不會被編譯器解析或類型檢查。編譯器將有關該操作的信息打包在一起,然后將該信息用於在以下位置評估該操作作為過程的一部分,動態類型的變量將被編譯為對象類型的變量。因此,動態類型僅在編譯時存在,而在運行時不存在。

所以

dynamic dynamicValueHolder = new ValueHolder<int>(){ HeldValue = 44 }; 

不會處理拳擊。

但是動態編譯就像對象一樣,而對象是引用類型。 創建引用類型時,它可以包含值類型屬性,並且這些屬性存儲在堆中,因為它們是引用類型的一部分(有關更多信息,請參閱 c-sharpcorner文章。然后

int y = dynamicValueHolder.HeldValue;

表示拆箱。

暫無
暫無

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

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