考虑以下表达式:
new Tuple<int,int>(1,2);
Tuple.Create(1,2);
这两种元组创建方法有什么区别吗?从我的阅读来看,它似乎比C ++中的对象创建(堆与堆栈)更简单。
答案 0 :(得分:23)
就个人而言,我发现Tuple.Create()
更简洁,更容易阅读。
引擎盖下没有任何区别。 Tuple.Create()
重载方法只是调用您发布的第一个版本的一堆静态方法:
public static class Tuple
{
public static Tuple<T1> Create<T1>(T1 item1) {
return new Tuple<T1>(item1);
}
public static Tuple<T1, T2> Create<T1, T2>(T1 item1, T2 item2) {
return new Tuple<T1, T2>(item1, item2);
}
public static Tuple<T1, T2, T3> Create<T1, T2, T3>(T1 item1, T2 item2, T3 item3) {
return new Tuple<T1, T2, T3>(item1, item2, item3);
}
...
我认为一个好处是,由于您不必使用Tuple.Create
指定类型,因此您可以存储匿名类型,否则您将无法说明类型是什么。
public class Person
{
public string Name { get; set; }
public int Height { get; set; }
public DateTime BirthDate { get; set; }
}
var people = new List<Person>
{
new Person { Name = "Bob", Height = 72, BirthDate = new DateTime(1984,1,1) },
new Person { Name = "Mary", Height = 64, BirthDate = new DateTime(1980,2,2) }
};
var oneAnonList = people.Select(x => new { x.Name, x.BirthDate });
var twoAnonList = people.Select(x => new { x.Height, x.Name });
var myTuple = Tuple.Create(oneAnonList, twoAnonList);
这会创建一个包含两个匿名类型的元组,第一个是new { string Name, DateTime BirthDate }
,第二个是new { int Height, string Name }
。
你仍然没有太多可以做到这一点,因为要将它传递给另一个方法,你仍然需要能够定义参数的“类型”。所以它真的归结为方便。
答案 1 :(得分:19)
Tuple.Create
的好处是你通常可以省略类型参数,例如。 Tuple.Create(1,2)
比new Tuple<int,int>(1,2)
更简洁。
如果您尝试省略构造函数new Tuple(1,2)
中的类型参数,您将看到错误CS0712“无法创建静态类的实例'元组”“
答案 2 :(得分:8)
嗯,这个问题已经过去了......但是我认为我可能会做出建设性的贡献。从接受的答案:
我想有一个好处是,因为您不必使用Tuple.Create指定类型,您可以存储匿名类型,否则您将无法说出类型是什么< / p>
结果是这样的:您可以存储...的匿名类型。
但第一部分:
因为您不必使用Tuple.Create
指定类型
并非总是如此。请考虑以下情形:
interface IAnimal
{
}
class Dog : IAnimal
{
}
以下内容无法编译:
Tuple<IAnimal> myWeirdTuple;
myWeirdTuple = Tuple.Create(new Dog());
您必须在Create方法中指定type参数,如下所示:
myWeirdTuple = Tuple.Create<IAnimal>(new Dog());
与调用 new Tuple<IAnimal>(new Dog())
IMO
答案 3 :(得分:3)
没有区别。如果你看一下源代码,那就是做同样的事情。
http://referencesource.microsoft.com/#mscorlib/system/tuple.cs,9124c4bea9ab0199
例如:
Tuple.create(1,2);
将打电话
public static Tuple<T1, T2> Create<T1, T2>(T1 item1, T2 item2) {
return new Tuple<T1, T2>(item1, item2);
}
答案 4 :(得分:1)
从C#7开始,您现在可以像这样简单地声明 Value 元组:
var unnamed = (1, 2);
或
var named = (name: "Joe", age: 2);
在此处查看Microsoft文档:https://docs.microsoft.com/en-us/dotnet/csharp/tuples