【问题标题】:How do VB.NET anonymous types without key fields differ from C# anonymous types when compared?比较时,没有键字段的 VB.NET 匿名类型与 C# 匿名类型有何不同?
【发布时间】:2014-02-11 13:49:47
【问题描述】:

我对此一头雾水,因为我不明白为什么会发生以下情况:

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

【问题讨论】:

  • 可能是由equals/==差异引起的。你如何比较它们?如果字段相同,C# equals 在 anynomus 类中返回 true。

标签: c# vb.net anonymous-types


【解决方案1】:

在 C# 中,匿名类型的所有属性的行为就好像它们在 VB 中具有 Key 修饰符:这些属性是只读的,它们包含在相等和哈希码评估中。

在 VB 中,没有Key 修饰符的属性是可变的,并且Equals/GetHashCode 实现中使用。

来自Anonymous Type Definition documentation

如果匿名类型声明至少包含一个键属性,则类型定义会覆盖从Object 继承的三个成员:EqualsGetHashCodeToString。如果未声明任何关键属性,则仅覆盖 ToString。覆盖提供以下功能:

  • Equals 如果两个匿名类型实例是同一个实例,或者满足以下条件,则返回 True:

    • 它们具有相同数量的属性。
    • 属性以相同的顺序声明,具有相同的名称和相同的推断类型。名称比较不区分大小写。
    • 至少有一个属性是键属性,并且 Key 关键字应用于相同的属性。
    • 比较每对对应的关键属性返回 True。
  • GetHashcode 提供了一个适当独特的GetHashCode 算法。该算法仅使用关键属性来计算哈希码。

  • ToString 返回一个串联属性值的字符串,如下例所示。包括关键和非关键属性。

【讨论】:

  • 谢谢乔恩(顺便说一句,享受你的第三版)。那么 C# 没有具有可变属性的匿名类型吗?如果是这样,你知道为什么它没有,而 VB.NET 有吗?
  • @Rondles:不,C# 不支持。恐怕我不确定差异来自哪里。
猜你喜欢
  • 2018-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-13
  • 1970-01-01
  • 2017-05-01
  • 1970-01-01
  • 2010-09-28
相关资源
最近更新 更多