匿名类型和元组

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

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

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

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

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

 Tuple GetTuple() { return Tuple.Create(1, "Bob"); } 

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

另外,正如Brian所提到的, Tuple上的属性名称是固定的 – 它们总是Item1Item2Item3等等,而使用匿名类型则可以选择名称。 如果你写:

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

然后匿名类型实际上具有IDName属性。 但如果你写:

 Tuple.Create(1, "Bob") 

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

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

这很酷。

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

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

或者编写自己的元组类。


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