Dot-Net

為什麼 .NET 中的匿名類型實現為引用類型?

  • August 18, 2011

因為匿名類型無論如何都是只讀的,所以如果他們將它們實現為結構會更有效,這樣 linq 查詢就不需要創建大量的臨時對象:

// This doesn't make any sense, it is just for demonstration
var result = thingies
.Select(x=> new {A = 1, B = 2, C = 3});

順便提一句。我有這個想法,當讀到這個

編輯:

如果編譯器會根據變數的大小和使用情況(如果必須傳遞給許多方法)來決定是創建值類型還是引用類型,那將是最棒的事情。

但是我在 msdn 中找到的以下句子是否會導致問題:

如果同一程序集中的兩個或多個匿名類型具有相同數量和類型的屬性,以相同的順序,編譯器將它們視為相同的類型。

由於匿名對象(及其關聯類型)不能離開它定義的方法,我們在這裡沒有問題,不是嗎?

完整的 .NET 垃圾收集器針對以下兩種情況進行了特別優化:持續大量時間的大型長壽命對象和快速死亡的短壽命小型對象。考慮到 Gen0 集合的速度,它們實際上是免費的(實際上如此快速和頻繁,以至於許多分析器甚至都不費心顯示它們或它們的內容),因此沒有理由避免將在範圍內消失的臨時對象創建它們的函式。

匿名類型幾乎完全符合第二種情況;它們的壽命並不長於創建它們的函式(儘管您可以通過一些技巧來做到這一點)。鑑於此模型,並且鑑於大多數值類型的複製成本相對較高,並且鑑於許多 LINQ 查詢涉及一長串函式,這些函式都需要另一個副本,對我來說設計人員選擇製作是有道理的它們引用類型。

引用自:https://stackoverflow.com/questions/7109101