匿名类型和元组之间有什么区别?
答案 0 :(得分:20)
元组不是匿名类型,它是命名类型。您可以将它用作返回类型或方法参数。此代码有效:
Tuple<int, string> GetTuple()
{
return Tuple.Create(1, "Bob");
}
您无法使用匿名类型执行此操作,而是必须返回System.Object
。通常,您最终必须对这些对象(或.NET 4中的dynamic
)使用Reflection才能获取各个属性的值。
另外,正如Brian提到的那样,Tuple
上的属性名称是固定的 - 它们始终是Item1
,Item2
,Item3
等等,而您可以选择匿名类型的名称。如果你写:
var x = new { ID = 1, Name = "Bob" }
然后,匿名类型实际上具有ID
和Name
属性。但如果你写:
Tuple.Create(1, "Bob")
然后生成的元组只有属性Item1
和Item2
。
答案 1 :(得分:20)
这个答案稍微更新一下,因为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());
}
那很酷。
答案 2 :(得分:18)
匿名类型具有包含更多信息的属性名称,对于没有此元组的元组。您不能使用匿名类型作为返回值和参数,您可以使用元组。
元组很好的一个例子是当你想要返回多个值时。 @Petar Minchev mentions this link给出了一个很好的例子。
您可能需要一个同时返回索引和值的Find()
方法。另一个例子是2d或3d平面中的位置。
答案 3 :(得分:8)
支持匿名类型的另一点是,您可以轻松拥有超过8个属性。虽然使用元组是可行的,但它并不那么漂亮。
var tuple = Tuple.Create(1, 2, 3, 4, 5, 6, 7, Tuple.Create(8, 9)); //and so on
或编写自己的元组类。
值得注意的一个有趣的相似之处是,元组和匿名类型默认情况下会根据属性为您提供不可变性和相等的可比性(覆盖Equals
和GetHashCode
)。