C#7.0 ValueTuples与匿名类型

时间:2016-12-15 13:09:01

标签: c# tuples anonymous-types c#-7.0

查看新的C#7.0 ValueTuples,我想知道它们是否会完全取代Anonymous Types。我理解ValueTuples是结构,因此与Anonymous Types类似的行为有点不同。但是,我没有看到用例,我更倾向于使用Anonymous Type而不是ValueTuple

在C#7.0中使用Anonymous Type使用ValueTuples仍然有用的用例是否有用?

2 个答案:

答案 0 :(得分:18)

匿名类型是不可变的,元组不是。这反映在匿名类型公开属性,元组公开字段的事实中。数据绑定几乎总是需要属性。

大量现有代码仅适用于引用类型,而不适用于值类型。特别想到的是实体框架中的预测:对价值类型的预测根本没有实现。

答案 1 :(得分:4)

  • 匿名类型可以向内携带名称数据 ,但不能在签名
  • 上表达名称数据
  • 值元组可以在签名上表达名称数据,但不能在内部
  • 携带名称数据

签名示例:

(int Id, string Name) GetFoo(...) // could also use tuples in args, but not very useful

无法对匿名类型执行此操作,因为除了签名上的object之外,您不能表达匿名类型。

“向内”示例:

由此,我的意思是将名称数据传递到。例如,如果我们考虑JSON:

var json = SomeJsonConvertAPI(new { Id = 42, Name = "abc" });

该库将能够看到名称IdName,并相应地工作(与{"Id":42,"Name":"abc"}之类的JSON一起使用);但是,使用值元组不可能-任何库,无论使用<T>还是object或其他方法,都只会看到Item1,{{ 1}}等-没有机制来获取原始站点上存在的名称数据。

好的 类似于值元组和匿名类型,但是可以在签名中使用,以向内传递到库中。因此,C#9为您提供了记录

Item2

对于拥有成员record Foo(int Id, string Name); class Foo且拥有所有构造函数和相等性位的int Id {get;}来说,这是简写。