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)
这很酷.
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)
那么匿名类型实际上有ID和Name属性.但如果你写:
Tuple.Create(1, "Bob")
Run Code Online (Sandbox Code Playgroud)
然后生成的元组只有属性Item1和Item2.
支持匿名类型的另一点是,您可以轻松拥有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).
| 归档时间: |
|
| 查看次数: |
11764 次 |
| 最近记录: |