【问题标题】:Anonymous type and tuple匿名类型和元组
【发布时间】:2011-02-06 12:22:16
【问题描述】:

匿名类型和元组有什么区别?

【问题讨论】:

标签: c# c#-4.0 language-features anonymous-types tuples


【解决方案1】:

由于 C# 7 已广泛使用,因此对此答案进行了一些更新。元组现在拥有超能力,有时可以替代匿名类型和类。以这个方法为例,它接受并返回具有命名属性的元组。

void Main()
{
    var result = Whatever((123, true));
    Debug.Assert(result.Something == 123);
    Debug.Assert(result.Another == "True");
}

(int Something, string Another) Whatever((int Neat, bool Cool) data)
{
    return (data.Neat, data.Cool.ToString());
}

这很酷。

【讨论】:

  • 请记住,这些元组与旧的元组或匿名类型不同。它们是具有字段的结构的 ValueTuples,而匿名类型是具有属性的类。
【解决方案2】:

元组不是匿名类型,而是命名类型。您可以将其用作返回类型或方法参数。此代码有效:

Tuple<int, string> GetTuple()
{
    return Tuple.Create(1, "Bob");
}

您不能对匿名类型执行此操作,而必须返回 System.Object。通常,您最终不得不对这些对象(或 .NET 4 中的 dynamic)使用反射来获取各个属性的值。

另外,正如 Brian 提到的,Tuple 上的属性名称是固定的 - 它们始终是 Item1Item2Item3 等等,而对于匿名类型,您可以选择名称.如果你写:

var x = new { ID = 1, Name = "Bob" }

那么匿名类型实际上有IDName 属性。但如果你写:

Tuple.Create(1, "Bob")

那么生成的元组只有属性Item1Item2

【讨论】:

  • 关于名称“always Item1, Item2”的部分在 C# 7 中不再正确。请参阅上面的 @alex-dresko 回复。
  • Item1 和 Item2 仍然可以使用,即使它的属性被命名为 ID 和 Name。 item1 然后将引用 ID。这适用于 C#7 及更高版本。
【解决方案3】:

匿名类型具有携带更多信息的属性名称,对于您没有此的元组。你不能使用匿名类型作为返回值和参数,你可以使用元组。

当你想要返回多个值时,一个元组很好的例子。 @Petar Minchev mentions this link 就是一个很好的例子。

您可能需要一个返回索引和值的Find() 方法。另一个例子是 2d 或 3d 平面中的位置。

【讨论】:

  • 这是一个 11 岁的答案,所以我不确定它是否相关,但匿名类型可以用作返回值。
【解决方案4】:

支持匿名类型的另一点是您可以轻松拥有超过 8 个属性。虽然使用元组这是可行的,但它并不那么漂亮。

var tuple = Tuple.Create(1, 2, 3, 4, 5, 6, 7, Tuple.Create(8, 9)); //and so on

或编写您自己的元组类。


需要注意的一个有趣的相似之处是,元组和匿名类型都基于默认属性为您提供不变性和相等可比性(都覆盖 EqualsGetHashCode)。

【讨论】:

    猜你喜欢
    • 2011-12-29
    • 2011-09-03
    • 2017-09-10
    • 2011-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-19
    相关资源
    最近更新 更多