[英]C# Nullable value type generates garbage?
Nullable值類型是否會生成垃圾? 例如:結構不是在堆上創建的,而是在堆棧上創建的,因為它是一個值類型。 但是當該結構可以為空時,它仍然是一個值類型並仍然在堆棧上創建嗎?
我問這個問題,因為我需要一個不會產生垃圾的可以為空的結構。
結構不是在堆上創建的,而是在堆棧上創建的,因為它是值類型。
這是一種常見的誤解,完全是誤導。 在堆上創建作為數組元素的結構。 在堆上創建作為類的字段的結構。 在堆上創建一個結構,它是lambda的一個封閉的外部變量。 結構始終在堆上創建。 只有當已知的變量生命周期比它們所處的方法的變量生命周期短時,才會在堆棧上創建結構。顯然,如果它們的生命周期比方法的堆棧框架長,它們就無法在堆棧上創建!
此外,每個人都忘記了注冊。 寄存器既不是堆也不是堆棧。 如果優化器決定刻錄寄存器是值得的,那么優化器就不會阻止優化器生成結構作為寄存器。
但是當該結構可以為空時,它仍然是值類型嗎?
是。 可空類型是值類型。 (雖然它不符合泛型類型或方法的值類型約束,但它具有特殊的裝箱行為。)
它仍然是在堆棧上創建的嗎?
如果在堆上創建了非可空值類型,那么也將在那里創建可以為空的值。
我需要一個不會生成垃圾的可空結構。
如果非可空結構不生成垃圾,那么可空結構也不會生成垃圾。
在MSDN上查看N的Nullable ,很明顯,nullables仍然是結構,因此仍然在適當的堆棧上創建。
[SerializableAttribute]
public struct Nullable<T>
where T : struct, new()
不僅僅是在堆棧上創建結構。
這篇文章解釋了Nullable的工作原理。 內存中可存儲的可空類型?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.