Ale*_*sko 25

只是对这个答案稍作更新,因为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());
}
Run Code Online (Sandbox Code Playgroud)

这很酷.

  • 请记住,这些元组与旧的元组或匿名类型不同。它们是 ValueTuples,是带有字段的结构,而匿名类型是带有属性的类。 (4认同)

Aar*_*ght 20

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

Tuple<int, string> GetTuple()
{
    return Tuple.Create(1, "Bob");
}
Run Code Online (Sandbox Code Playgroud)

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

此外,正如布赖恩提到,在属性名Tuple是固定的-他们总是Item1,Item2,Item3等等,而与匿名类型可以选择任何名称.如果你写:

var x = new { ID = 1, Name = "Bob" }
Run Code Online (Sandbox Code Playgroud)

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

Tuple.Create(1, "Bob")
Run Code Online (Sandbox Code Playgroud)

然后生成的元组只有属性Item1Item2.

  • 关于名称“始终`Item1`、`Item2`”的部分在 C# 7 中不再正确。请参阅上面的 @alex-dresko 响应。 (3认同)

Bri*_*ndy 18

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

元组很好的一个例子是当你想要返回多个值时.@Petar Minchev 提到了这个链接,它提供了一个很好的例子.

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


naw*_*fal 8

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

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

或者编写自己的元组类.


值得注意的一个有趣的相似之处是,元组和匿名类型默认情况下会根据属性为您提供不变性和相等性(可覆盖性Equals和可比性GetHashCode).