你可以解釋使用語句中的匿名類型嗎?你能說明利弊兩種用法嗎?你可以解釋使用語句的匿名類型嗎?
using(var myCtx = new Entity())
{
}
另:
using(Entity myCtx = new Entity())
{
}
什麼是它們之間的區別?
你可以解釋使用語句中的匿名類型嗎?你能說明利弊兩種用法嗎?你可以解釋使用語句的匿名類型嗎?
using(var myCtx = new Entity())
{
}
另:
using(Entity myCtx = new Entity())
{
}
什麼是它們之間的區別?
沒有爲兩個語句產生的IL之間沒有區別,它們是功能上相同。你在這裏做的是讓編譯器推斷myCtx
,的類型而不是創建一個不一致的類型。它可以使代碼基本上更清晰,例如:
var items = new Dictionary<int, Dictionary<int, string>>();
更清晰,並且不隱藏任何代碼的意圖,比:
Dictionary<int, Dictionary<int, string>> items =
new Dictionary<int, Dictionary<int, string>>();
這實際上不是匿名類型的用法......它是推斷的類型用法。使用var關鍵字根據賦值的右側簡單地「推斷」賦值左側的類型。使用時
混淆了代碼:
優點:
缺點在某些情況下(如VAR一個= GetSomething(); ---什麼類型的是我不知道不看的GetSomething()的返回類型?)
您使用VAR(你不能有一個MyParentType =新MySubType())時失去的能力多態性 - 這是不是一個真正的騙子,這麼多的無效使用情況var關鍵字。
我的經驗法則是,我喜歡var關鍵字,而只是它的意圖使用它已經是明確的......也就是說,我使用new關鍵字的時候使用它,而不是foreach循環或基於方法的返回值的分配。
這不是一個匿名類型,它只是一個語法快捷方式。就編譯器而言,這兩個語句是相同的。
這是一個隱式類型變量,不是匿名類型。 (匿名類型是你用這樣的表達new { X = 10, Y = "hello" }
什麼
你的兩段代碼是完全等價的 - 編譯器只是推斷類型的myCtx
:它仍然是靜態類型,對象仍將被佈置等等。
這裏沒有什麼特別的using
聲明 - 只要所需的類型與初始化表達式的編譯時類型相同,就可以對任何局部變量使用隱式類型。(如果值爲null
或者匿名函數,則需要施加該值,此時老實說,使用var
是合理無用的。)
Blatant plug:你可以找到更多的細節在我的書的第8章C#深入中隱式鍵入和匿名類型。幸運的是,這是您可以從Manning page for the book下載的免費章節之一。
在這兩個樣本中,myCtx都不是匿名的。 – 2011-04-02 10:16:24
[使用var或不使用var]的可能重複(http://stackoverflow.com/questions/4050535/using-var-or-not-using-var) – 2011-04-02 10:22:27