簡體   English   中英

沒有關鍵字段的VB.NET匿名類型在比較時與C#匿名類型有何不同?

[英]How do VB.NET anonymous types without key fields differ from C# anonymous types when compared?

我正在摸不着頭腦,因為我無法理解為什么會發生以下情況:

'//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那樣?

在C#中,匿名類型的所有屬性都表現得好像它們在VB中具有Key修飾符:屬性是只讀的,並且它們包含在相等和散列碼評估中。

在VB中,沒有Key修飾符的屬性是可變的,並且不在 Equals / GetHashCode實現中使用。

匿名類型定義文檔

如果匿名類型聲明包含至少一個鍵屬性,則類型定義將覆蓋從Object繼承的三個成員: EqualsGetHashCodeToString 如果未聲明任何鍵屬性,則僅覆蓋ToString 覆蓋提供以下功能:

  • 如果兩個匿名類型實例是同一個實例,或者它們滿足以下條件,則Equals返回True:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM