Tuple.Create()vs new Tuple

请考虑以下表达式:

new Tuple(1,2); Tuple.Create(1,2); 

这两种元组创建方法有什么区别吗? 从我的阅读来看,它似乎比C ++中的对象创建(堆与堆栈)更方便。

嗯,这个问题已经过时了……但我认为我可能会做出建设性的贡献。 从接受的答案:

我想一个好处是,因为您不必使用Tuple.Create指定类型,您可以存储匿名类型,否则您将无法说明类型是什么

结果是这样的:你可以存储匿名类型……

但第一部分:

因为您不必使用Tuple.Create指定类型

并非总是如此。 请考虑以下情形:

 interface IAnimal { } class Dog : IAnimal { } 

以下内容无法编译:

 Tuple myWeirdTuple; myWeirdTuple = Tuple.Create(new Dog()); 

您必须在Create方法中指定type参数,如下所示:

 myWeirdTuple = Tuple.Create(new Dog()); 

这与调用new Tuple(new Dog()) IMO一样冗长

就个人而言,我发现Tuple.Create()更简洁,更容易阅读。

引擎盖下没有区别。 Tuple.Create()重载方法只是调用您发布的第一个版本的一堆静态方法:

 public static class Tuple { public static Tuple Create(T1 item1) { return new Tuple(item1); } public static Tuple Create(T1 item1, T2 item2) { return new Tuple(item1, item2); } public static Tuple Create(T1 item1, T2 item2, T3 item3) { return new Tuple(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 { 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 }

你仍然没有太多可以做到这一点,因为要将它传递给另一个方法,你仍然需要能够定义参数的“类型”。 所以它真的归结为方便。

Tuple.Create的好处是你通常可以省略类型参数,例如。 Tuple.Create(1,2)new Tuple(1,2)更简洁。

如果您尝试从构造函数new Tuple(1,2)省略类型参数,您将看到错误CS0712“ 无法创建静态类’Tuple的实例’

没有区别。 如果你看一下源代码,那就是做同样的事情。

http://referencesource.microsoft.com/#mscorlib/system/tuple.cs,9124c4bea9ab0199

例如:

 Tuple.create(1,2); 

打算打电话

  public static Tuple Create(T1 item1, T2 item2) { return new Tuple(item1, item2); }