元组<x1,x2 ..>之间有什么优点/缺点。创建和新元组<x1,x2 ..> </x1,x2 ..> </x1,x2 ..>

时间:2015-03-09 12:34:28

标签: c#

我应该使用Tuple.Create()代替新的Tuple()吗?

Microsoft必须有两种方法来创建同一个对象。速度差异或其他已知优势/劣势?

3 个答案:

答案 0 :(得分:3)

可悲的是,在C#构造函数中,不要进行类型推断。所以你不能写:

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

虽然方法是这样做的:

Tuple<int, int> xxx = Tuple.Create(1, 2);

使用您需要的构造函数:

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

这更详细。

请注意,如果类型推断不适合您(因为您想要一个与您传递的参数不同类型的元组):

Tuple<object, object> xxx = Tuple.Create("A", "B"); // Invalid

然后它们等同于详细程度:

Tuple<object, object> xxx = Tuple.Create<object, object>("A", "B");

Tuple<object, object> xxx = new Tuple<object, object>("A", "B");

Tuple<object, object> xxx = Tuple.Create((object)"A", (object)"B");

答案 1 :(得分:2)

source code Tuple.Create(item1)看到的只是致电new Tuple<T1>(item1)。所以,它们之间没有任何速度差异。

 public static Tuple<T1> Create<T1>(T1 item1) {
            return new Tuple<T1>(item1);
        }

因此,您可以通过两种方式创建集合:

Tuple<int> myTuple = Tuple.Create(1); // This one uses type inference
Tuple<int> myTuple = new Tuple<int>(1);

但是,当然存在构造函数和泛型方法都存在的原因。 C#中的构造函数无法支持 类型推断 。因此,他们必须为 支持类型推断 创建一些 通用方法 。 例如,这将为您提供编译器错误:

Tuple<int> myTuple = new Tuple(1); // Oops, compiler error

因此,我们可以通过Create()方法编写此代码,而不是编写上述代码:

Tuple<int> myTuple = Tuple.Create(1);


顺便说一下,如果您想知道为什么C#构造函数不能推断类型,您可以阅读 Eric Lippert's answer 以获取更多信息。

答案 2 :(得分:2)

没有速度差异,但由于Create是一个通用方法,因此编译器可以为您推断通用参数类型。这对构造函数来说是不可能的。