2011-04-02 39 views
0

你可以解釋使用語句中的匿名類型嗎?你能說明利弊兩種用法嗎?你可以解釋使用語句的匿名類型嗎?

using(var myCtx = new Entity()) 
{ 

} 

另:

using(Entity myCtx = new Entity()) 
{ 

} 

什麼是它們之間的區別?

+1

在這兩個樣本中,myCtx都不是匿名的。 – 2011-04-02 10:16:24

+0

[使用var或不使用var]的可能重複(http://stackoverflow.com/questions/4050535/using-var-or-not-using-var) – 2011-04-02 10:22:27

回答

2

沒有爲兩個語句產生的IL之間沒有區別,它們是功能上相同。你在這裏做的是讓編譯器推斷myCtx,的類型而不是創建一個不一致的類型。它可以使代碼基本上更清晰,例如:

var items = new Dictionary<int, Dictionary<int, string>>(); 

更清晰,並且不隱藏任何代碼的意圖,比:

Dictionary<int, Dictionary<int, string>> items = 
    new Dictionary<int, Dictionary<int, string>>(); 
2

這實際上不是匿名類型的用法......它是推斷的類型用法。使用var關鍵字根據賦值的右側簡單地「推斷」賦值左側的類型。使用時

  • 混淆了代碼:

    優點:

    • 消除冗餘(例如MyType的一個=新的MyType()是高度冗餘的和不必要的)

    缺點在某些情況下(如VAR一個= GetSomething(); ---什麼類型的是我不知道不看的GetSomething()的返回類型?)

  • 您使用VAR(你不能有一個MyParentType =新MySubType())時失去的能力多態性 - 這是不是一個真正的騙子,這麼多的無效使用情況var關鍵字。

我的經驗法則是,我喜歡var關鍵字,而只是它的意圖使用它已經是明確的......也就是說,我使用new關鍵字的時候使用它,而不是foreach循環或基於方法的返回值的分配。

2

這不是一個匿名類型,它只是一個語法快捷方式。就編譯器而言,這兩個語句是相同的。

5

這是一個隱式類型變量,不是匿名類型。 (匿名類型是你用這樣的表達new { X = 10, Y = "hello" }什麼

你的兩段代碼是完全等價的 - 編譯器只是推斷類型的myCtx:它仍然是靜態類型,對象仍將被佈置等等。

這裏沒有什麼特別的using聲明 - 只要所需的類型與初始化表達式的編譯時類型相同,就可以對任何局部變量使用隱式類型。(如果值爲null或者匿名函數,則需要施加該值,此時老實說,使用var是合理無用的。)

Blatant plug:你可以找到更多的細節在我的書的第8章C#深入中隱式鍵入匿名類型。幸運的是,這是您可以從Manning page for the book下載的免費章節之一。

相關問題