看到新的 C# 7.0 ValueTuples,我在想它们是否会完全取代匿名类型
。我知道ValueTuples
是结构体,因此与匿名类型
(类)有一些不同的行为。然而,我没有看到任何情况下使用匿名类型
比使用ValueTuple
更好的用例。
在 C# 7.0 中,是否仍有某些情况下,使用匿名类型
仍优于使用ValueTuples
的用例呢?
看到新的 C# 7.0 ValueTuples,我在想它们是否会完全取代匿名类型
。我知道ValueTuples
是结构体,因此与匿名类型
(类)有一些不同的行为。然而,我没有看到任何情况下使用匿名类型
比使用ValueTuple
更好的用例。
在 C# 7.0 中,是否仍有某些情况下,使用匿名类型
仍优于使用ValueTuples
的用例呢?
匿名类型是不可变的,ValueTuple
则不是。这反映在匿名类型公开属性,而ValueTuple
公开字段。数据绑定几乎总是需要属性。
许多现有代码仅适用于引用类型,而不适用于值类型。特别是在Entity Framework中的投影:对值类型的投影根本没有实现。
签名示例:
(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" });
图书馆将能够查看名称Id
和Name
,并据此工作(生成类似于{"Id":42,"Name":"abc"}
的JSON);然而,对于值元组来说这是不可能的 - 无论使用<T>
、object
还是其他内容的任何库,都只能看到Item1
、Item2
等 - 没有机制可以获取存在于原始站点的名称数据。
更好的方式是希望有一种类似于值元组和匿名类型的简洁方式,但可以在签名中使用并向内部库发送;因此,C# 9为您提供了记录:
record Foo(int Id, string Name);
这是一个简写,代表一个具有成员int Id {get;}
和string Name {get;}
的class Foo
,并且包含您期望的所有构造函数和相等性位。