我应该使用Tuple.Create()代替新的Tuple()吗?
Microsoft必须有两种方法来创建同一个对象。速度差异或其他已知优势/劣势?
答案 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
是一个通用方法,因此编译器可以为您推断通用参数类型。这对构造函数来说是不可能的。