2013-10-01 67 views

回答

3

什麼是正常的類型和匿名類型在C#中關於在運行時內存管理之間的區別?匿名類型在某種程度上比普通類型更低效嗎?

匿名類型是既不多也比一般的內部類使用構造,只讀字段,以及GetHashCodeToString一個實現以下。就運行時而言,沒有什麼特別的。運行時不知道它們是「匿名的」;運行時將它們視爲另一個類。生成的代碼沒有意思。

關於編譯過程,C#中的正常類型和匿名類型有什麼區別?

我不知道這個問題意味着要問什麼。

+0

謝謝,對於最後一個問題感到抱歉,它太寬泛了。我的意思是,這兩種類型都是以不同的方式編譯的?也許一個比另一個分配更多或更少的內存?或者編譯器在使用匿名類型時是否已經存在或者不存在很大的代價? –

+1

@ guillegr123:好吧,像編譯器開發人員一樣思考。根據規範,您必須能夠識別同一個程序集中兩次使用「相同」匿名類型的情況,其中「相同」的意思是字段的數量,類型和名稱是相同的,並且在相同的順序。你將如何實現必須跟蹤(類型,名稱)對的兩個列表是否相同的代碼? –

+0

謝謝。所以這意味着匿名類型可以在相同的範圍內重用,如果它使用的字段的數量,類型和名稱相同?例如:'a = new {x = 1,y = 1}; b = new {x = 2,y = 3};' –

10

MSDN來自: -

匿名類型提供一種方便的方式來封裝一組 只讀屬性到一個單一的對象,而無需首先 明確地定義一個類型。類型名稱由編譯器 生成,並且在源代碼級別不可用。編譯器推斷 屬性的類型。

備註:

匿名類型是直接從對象派生引用類型。 編譯器給他們一個名字,儘管你的應用程序不能訪問 它。從公共語言運行時的角度來看,匿名 類型與其他任何引用類型沒有區別,但 不能轉換爲除對象外的任何類型。

+2

並且可以被分配到一個「動態」,他們也不能離開它們被創建的範圍,除非它們被分配給一個對象或動態的,但是因爲你不能將它從一個對象中退出,如果你想要從一個函數返回一個匿名對象,你的函數應該返回動態類型。 – ohmusama

+3

@ohmusama:你的說法通常被認爲是錯誤的。考慮函數:'static T M (Func f){return f(); }現在調用它:'var anon = M((=)=> new {X = 1});'函數M創建並返回一個匿名類型的對象,調用者成功地將它保存在一個匿名類型的局部變量中,所以你聲稱「他們不能離開他們創建的範圍,除非轉換爲對象或動態」是錯誤的。 –

+0

@EricLippert好的,如果我在函數中創建它,而不通過它,我該如何解決它。因爲這個例子和說'var anon = new {X = 1};' – ohmusama