簡體   English   中英

C#Nullable值類型生成垃圾?

[英]C# Nullable value type generates garbage?

Nullable值類型是否會生成垃圾? 例如:結構不是在堆上創建的,而是在堆棧上創建的,因為它是一個值類型。 但是當該結構可以為空時,它仍然是一個值類型並仍然在堆棧上創建嗎?

我問這個問題,因為我需要一個不會產生垃圾的可以為空的結構。

結構不是在堆上創建的,而是在堆棧上創建的,因為它是值類型。

這是一種常見的誤解,完全是誤導。 在堆上創建作為數組元素的結構。 在堆上創建作為類的字段的結構。 在堆上創建一個結構,它是lambda的一個封閉的外部變量。 結構始終在堆上創建。 只有當已知的變量生命周期比它們所處的方法的變量生命周期短時,才會在堆棧上創建結構。顯然,如果它們的生命周期比方法的堆棧框架長,它們就無法在堆棧上創建!

此外,每個人都忘記了注冊。 寄存器既不是堆也不是堆棧。 如果優化器決定刻錄寄存器是值得的,那么優化器就不會阻止優化器生成結構作為寄存器。

但是當該結構可以為空時,它仍然是值類型嗎?

是。 可空類型是值類型。 (雖然它不符合泛型類型或方法的值類型約束,但它具有特殊的裝箱行為。)

它仍然是在堆棧上創建的嗎?

如果在堆上創建了非可空值類型,那么也將在那里創建可以為空的值。

我需要一個不會生成垃圾的可空結構。

如果非可空結構不生成垃圾,那么可空結構也不會生成垃圾。

在MSDN上查看N的Nullable ,很明顯,nullables仍然是結構,因此仍然在適當的堆棧上創建。

[SerializableAttribute]
public struct Nullable<T>
where T : struct, new()

不僅僅是在堆棧上創建結構。

這篇文章解釋了Nullable的工作原理。 內存中可存儲的可空類型?

簡短的答案是,如果你希望他們不住在堆中, 那就制作它們

局部變量或臨時值,局部變量不是匿名方法或lambda的外部變量,而局部變量不在迭代器塊中。

將這部分邏輯基於這一事實是非常危險的,因為它可能會發生變化而無法保證。 這也適用於原始值類型,因此Sentinel值而不是使用Nullable<T>不會突然刪除此問題。

暫無
暫無

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

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