C# 7.0 ValueTuples 与匿名类型

C# 7.0 ValueTuples vs Anonymous Types

看着新的 C# 7.0 ValueTuples,我想知道它们是否会完全取代 Anonymous Types。我知道 ValueTuples 是结构,因此与 Anonymous Types 的行为有点不同,后者是 类。但是,我没有看到我更喜欢使用 Anonymous Type 而不是 ValueTuple.

的用例

在 C# 7.0 中使用 Anonymous Type 是否仍然比使用 ValueTuples 更有利?

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

大量现有代码仅适用于引用类型,不适用于值类型。特别想到的是 Entity Framework 中的投影:根本没有实现对值类型的投影。

  • 匿名类型可以携带姓名数据向内,但不能在signatures
  • 上表达姓名数据
  • 值元组可以表达signatures上的姓名数据,但不能携带姓名数据inwards

签名示例:

(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,并相应地工作(提出 JSON 就像 {"Id":42,"Name":"abc"});然而,not value-tuples 是不可能的 - 任何图书馆,无论是使用 <T> 还是 object 或其他东西,都只会看到 Item1Item2 等 - 没有机制来获取存在于原始站点的名称数据。

什么是 nice 将是类似于 value-tuples 和匿名类型的简洁的东西,但可以在签名中使用 and 向内传递到图书馆;因此 C# 9 给你 records:

record Foo(int Id, string Name);

对于具有成员 int Id {get;}string Name {get;}class Foo 以及您期望的所有构造函数和相等位,这是 short-hand。