2013-08-01 174 views
2

隱式類型和匿名類型之間是相同還是任何區別?如果不同,那麼隱式類型和匿名類型之間的主要區別是什麼?隱式類型與匿名類型

+1

這裏有一個很好的解釋http://social.msdn.microsoft.com/Forums/vstudio/en-US/af2d0b6c-f1f3-4007-9f65-4418aa940c82/what-are-implicit-type-var-and-匿名類型 – christiandev

回答

7

有一個巨大的差別:

隱式類型(本地)變量,是哪種類型的未明確給出變量:

var i = new StringBuilder(); 

現在,i是隱含StringBuilder類型 - 命名類型。

另一邊匿名類型沒有名字,他們是匿名

var x = new { Foo = "Bar" }; 

x是一個匿名類型的現在,隨着一個只讀屬性Foo

2

匿名類型只能用於聲明範圍。因此,您可以將其用於本地任務,並且不能在外部範圍中使用它。

引入了匿名類型來與linq一起使用,以實現簡單的分組和轉換。 主要目標是避免在單一範圍內使用的顯式類型聲明。

List<TypeOne> firstList; 
List<TypeTwo> secondList; 

var joined = firstList 
    .GroupJoin(secondlist, i => i.KeyOfTypeOne, i => i.KeyOfTypeTwo, (first, second) => new { First = first, Second = second}); 

所以新的匿名類型聲明,你可以用它在同樣的情況下,但不能發送到當前範圍的邊界作爲一個強類型的對象

TypeName Method() // you can't specify a type here except object or dynamic 
{ 
    ... 
    return joined; 
} 

但你可以本地使用它,沒有任何限制

return joined.Where(i => i.Second.Any()).Select(i => i.First); 

而在另一方面,隱式類型變量是用來讓你使用匿名類型的對象。 Compilator會調查你的代碼,並把真正的類型,而不是var關鍵字。

var inst = new {Name = "a";} 

compilator將產生一個匿名類型「{名稱=‘A’;}」,並用它在你的代碼替換變種。

+0

你確定你不能通過動態類型返回匿名類型嗎? –

+0

您可以通過對象類型返回它,但我沒有看到任何使用它的理由。 –

+0

但是,我沒有看到太多的理由,但是,你在你的帖子中說它會拋出一個編譯錯誤。 –

1

Implicitly Typed Local Variables (C# Programming Guide)

局部變量可以給出VAR代替 顯式類型的推斷「類型」。 var關鍵字指示編譯器根據初始化語句右側的表達式推斷變量類型 。推斷類型可以是內置類型,匿名類型,用戶定義類型或.NET Framework類庫中定義的類型。

另外:

了var關鍵字並不意味着 「變種」重要的是要理解,並不表明這個變量是弱類型,或 後期綁定。這只是表示編譯器確定並指定 最合適的類型

有匿名類型和隱式類型變量之間的關係的關鍵:

在許多情況下使用VAR是可選的,僅僅是一個語法 便利。然而,當一個變量與一個匿名 類型初始化必須,如果你需要在稍後訪問對象的 性聲明的變量VAR。

0

有這些

匿名類型之間的一些根本的區別:

他們有效地類類型與任何其他然後只讀屬性。沒有方法沒有事件。它們不能在本地範圍之外訪問/聲明。例如,如果在方法內部定義,則不能在該方法外訪問它們。

隱式類型的

我們可以用var作爲隱式類型。這實際上意味着表達式右側的任何類型都將被編譯器分配給該var。這些不能爲空。

2

它們之間存在着一定的差異

隱式類型

我們可以知道哪些數據類型或類的類型分配給VAR

e.g. 

var i = 10; /*here int datatype assigned*/ 
var A = new ArrayList(); /*here arraylist() class assigned*/ 

我們可以使用隱式類型也在另一個範圍內。

匿名類型

當我們不知道分配給VAR

e.g. 
var a = new { Age = 12 , Name = X }; 

匿名變量用於可能僅在被宣佈範圍類的哪種類型。但不能在另一個範圍內使用,並且不能寫回方法的語句。

通常在Linq語句中使用匿名。