2014-02-11 65 views
5

我抓我的頭關於這個問題,我不明白爲什麼會發生以下情況它的方式:比較時,沒有鍵字段的VB.NET匿名類型與C#匿名類型有什麼不同?

'//VB.NET 
Dim product1 = New With {.Name = "paperclips", .Price = 1.29} 
Dim product2 = New With {.Name = "paperclips", .Price = 1.29} 

'compare product1 and product2 and you get false returned. 

Dim product3 = New With {Key .Name = "paperclips", Key .Price = 1.29} 
Dim product4 = New With {Key .Name = "paperclips", Key .Price = 1.29} 

'compare product3 and product4 and you get true returned. 

'//C# 
var product5 = new {Name = "paperclips", Price = 1.29}; 
var product6 = new {Name = "paperclips", Price = 1.29}; 

//compare products 5 and 6 and you get true. 

什麼用的產品1和2,使他們不能表現得像產品5和6發生了什麼?

+0

也許它是由等於/ ==差異引起的..你如何比較它們?如果字段相同,C#在anynomus類中的equals會返回true。 –

回答

9

在C#中,匿名類型的所有屬性的行爲就好像它們在VB中具有Key修飾符:屬性是隻讀的,它們包含在相等和散列碼評估中。

在VB中,而不Key改性劑性能是可變的,並且是不Equals/GetHashCode實現中使用。

Anonymous Type Definition documentation

如果匿名類型聲明至少包含一個關鍵屬性,類型定義覆蓋三名成員從Object繼承:EqualsGetHashCodeToString。如果沒有聲明關鍵屬性,則只覆蓋ToString。該覆蓋提供以下功能:

  • Equals返回true如果兩個匿名類型實例是相同的實例,或者如果他們符合下列條件:

    • 它們具有相同的屬性。
    • 屬性以相同的順序聲明,具有相同的名稱和相同的推斷類型。名稱比較不區分大小寫。
    • 至少有一個屬性是關鍵屬性,而Key關鍵字應用於相同的屬性。
    • 每個相應鍵屬性對的比較返回True。
  • GetHashcode提供了適當唯一的GetHashCode算法。該算法僅使用密鑰屬性來計算哈希碼。
  • ToString返回一串連接的屬性值,如下例所示。包括關鍵和非關鍵屬性。
+2

感謝喬恩(享受你的第三版btw)。那麼C#沒有具有可變屬性的匿名類型?如果是這樣,任何想法爲什麼它不和VB.NET呢? – BenM

+2

@Rondles:不,C#不支持。恐怕我不確定這種差異是從哪裏來的。 –