C# 7.0的ValueTuples与匿名类型比较

33

看到新的 C# 7.0 ValueTuples,我在想它们是否会完全取代匿名类型。我知道ValueTuples是结构体,因此与匿名类型(类)有一些不同的行为。然而,我没有看到任何情况下使用匿名类型比使用ValueTuple更好的用例。

在 C# 7.0 中,是否仍有某些情况下,使用匿名类型仍优于使用ValueTuples的用例呢?

2个回答

27

匿名类型是不可变的,ValueTuple则不是。这反映在匿名类型公开属性,而ValueTuple公开字段。数据绑定几乎总是需要属性。

许多现有代码仅适用于引用类型,而不适用于值类型。特别是在Entity Framework中的投影:对值类型的投影根本没有实现。


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

签名示例:

(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还是其他内容的任何库,都只能看到Item1Item2等 - 没有机制可以获取存在于原始站点的名称数据。

更好的方式是希望有一种类似于值元组和匿名类型的简洁方式,但可以在签名中使用并向内部库发送;因此,C# 9为您提供了记录

record Foo(int Id, string Name);

这是一个简写,代表一个具有成员int Id {get;}string Name {get;}class Foo,并且包含您期望的所有构造函数和相等性位。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接