【发布时间】:2011-02-06 12:22:16
【问题描述】:
匿名类型和元组有什么区别?
【问题讨论】:
-
这是一篇解释你想要什么的文章:msdn.microsoft.com/en-us/vcsharp/ee957397.aspx
标签: c# c#-4.0 language-features anonymous-types tuples
匿名类型和元组有什么区别?
【问题讨论】:
标签: c# c#-4.0 language-features anonymous-types tuples
由于 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());
}
这很酷。
【讨论】:
元组不是匿名类型,而是命名类型。您可以将其用作返回类型或方法参数。此代码有效:
Tuple<int, string> GetTuple()
{
return Tuple.Create(1, "Bob");
}
您不能对匿名类型执行此操作,而必须返回 System.Object。通常,您最终不得不对这些对象(或 .NET 4 中的 dynamic)使用反射来获取各个属性的值。
另外,正如 Brian 提到的,Tuple 上的属性名称是固定的 - 它们始终是 Item1、Item2、Item3 等等,而对于匿名类型,您可以选择名称.如果你写:
var x = new { ID = 1, Name = "Bob" }
那么匿名类型实际上有ID 和Name 属性。但如果你写:
Tuple.Create(1, "Bob")
那么生成的元组只有属性Item1 和Item2。
【讨论】:
Item1, Item2”的部分在 C# 7 中不再正确。请参阅上面的 @alex-dresko 回复。
匿名类型具有携带更多信息的属性名称,对于您没有此的元组。你不能使用匿名类型作为返回值和参数,你可以使用元组。
当你想要返回多个值时,一个元组很好的例子。 @Petar Minchev mentions this link 就是一个很好的例子。
您可能需要一个返回索引和值的Find() 方法。另一个例子是 2d 或 3d 平面中的位置。
【讨论】:
支持匿名类型的另一点是您可以轻松拥有超过 8 个属性。虽然使用元组这是可行的,但它并不那么漂亮。
var tuple = Tuple.Create(1, 2, 3, 4, 5, 6, 7, Tuple.Create(8, 9)); //and so on
或编写您自己的元组类。
需要注意的一个有趣的相似之处是,元组和匿名类型都基于默认属性为您提供不变性和相等可比性(都覆盖 Equals 和 GetHashCode)。
【讨论】: