Tuple.Create()vs new Tuple

chr*_*ris 39 c# tuples

请考虑以下表达式:

new Tuple<int,int>(1,2);

Tuple.Create(1,2);
Run Code Online (Sandbox Code Playgroud)

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

Gra*_*ICA 30

就个人而言,我发现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);
    }

    ...
Run Code Online (Sandbox Code Playgroud)

我想一个好处是,由于您不必指定类型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);
Run Code Online (Sandbox Code Playgroud)

这会创建一个具有两个匿名类型的元组,第一个是a new { string Name, DateTime BirthDate },第二个是a new { int Height, string Name }.

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


Jac*_*ert 20

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

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


taq*_*ion 8

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

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

结果是真的:你可以存储匿名类型......

但第一部分:

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

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

interface IAnimal
{
}

class Dog : IAnimal
{
}
Run Code Online (Sandbox Code Playgroud)

以下内容无法编译:

Tuple<IAnimal> myWeirdTuple;

myWeirdTuple = Tuple.Create(new Dog());
Run Code Online (Sandbox Code Playgroud)

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

myWeirdTuple = Tuple.Create<IAnimal>(new Dog());
Run Code Online (Sandbox Code Playgroud)

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


d.m*_*ada 7

没有区别。如果你看一下源代码,它也在做同样的事情。

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

例如:

Tuple.create(1,2); 
Run Code Online (Sandbox Code Playgroud)

会打电话

public static Tuple<T1, T2> Create<T1, T2>(T1 item1, T2 item2) {
    return new Tuple<T1, T2>(item1, item2);
}
Run Code Online (Sandbox Code Playgroud)

  • 不再需要链接到第 3 方站点,微软创建了 [参考源的 Web 界面](http://referencesource.microsoft.com/#mscorlib/system/tuple.cs,9124c4bea9ab0199)。 (4认同)

Max*_*ter 5

从 C# 7 开始,您现在可以像这样简单地声明元组:

var unnamed = (1, 2);
Run Code Online (Sandbox Code Playgroud)

或者

var named = (name: "Joe", age: 2);
Run Code Online (Sandbox Code Playgroud)

在此处查看微软文档:https : //docs.microsoft.com/en-us/dotnet/csharp/tuples