考虑以下表达式:
new Tuple<int,int>(1,2);
Tuple.Create(1,2);
这两种元组创建方法有什么区别吗?根据我的阅读,它似乎更像是一种便捷的简写,而不像C++中的对象创建(堆 vs 栈)。
就个人而言,我觉得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 }
。
由于要传递到另一个方法中,仍然需要能够定义参数的“类型”,因此您可以做的仍然不是太多。所以它真的取决于方便性。
Tuple.Create
的好处在于通常可以省略类型参数,例如 Tuple.Create(1,2)
比 new Tuple<int,int>(1,2)
更简洁。
如果你尝试从构造函数 new Tuple(1,2)
中省略类型参数,你会看到错误 CS0712 "无法创建静态类 'Tuple' 的实例""
这个问题看起来有点旧了,但我认为我仍然可以做出有建设性的贡献。从被接受的答案中可以得知:
我想其中一个好处是,由于您无需使用 Tuple.Create 指定类型,因此可以存储匿名类型,否则您将无法确定其类型。
后面那一句话是正确的:您可以存储匿名类型,而您无法确定这些类型是什么。
但是第一部分:
由于您无需使用 Tuple.Create 指定类型
并不总是正确的。考虑以下情况:
interface IAnimal
{
}
class Dog : IAnimal
{
}
以下代码将无法编译:Tuple<IAnimal> myWeirdTuple;
myWeirdTuple = Tuple.Create(new Dog());
您将需要在创建方法中指定类型参数,如下所示:
myWeirdTuple = Tuple.Create<IAnimal>(new Dog());
在我看来,这段代码 new Tuple<IAnimal>(new Dog())
就像一个过于冗长的调用。
从 C# 7 开始,你现在可以像这样简单地声明 Value Tuple:
Starting with C# 7, 你现在可以像这样简单地声明 Value Tuple:
var unnamed = (1, 2);
或者var named = (name: "Joe", age: 2);
请参阅 Microsoft 文档:https://learn.microsoft.com/zh-cn/dotnet/csharp/tuples
没有区别。如果您查看源代码,它执行的是相同的操作。
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);
}
var
关键字的存在是因为Tuple<int, int> t1 = new Tuple<int,int>(1,2);
这样的语句过于冗长,使用var
可以让代码更简洁易读。注意不要改变原来的意思。 - Federico Berasategui