查看新的C#7.0 ValueTuples,我想知道它们是否会完全取代Anonymous Types
。我理解ValueTuples
是结构,因此与Anonymous Types
类似的行为有点不同。但是,我没有看到用例,我更倾向于使用Anonymous Type
而不是ValueTuple
。
在C#7.0中使用Anonymous Type
使用ValueTuples
仍然有用的用例是否有用?
答案 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" });
该库将能够看到名称Id
和Name
,并相应地工作(与{"Id":42,"Name":"abc"}
之类的JSON一起使用);但是,使用值元组不可能-任何库,无论使用<T>
还是object
或其他方法,都只会看到Item1
,{{ 1}}等-没有机制来获取原始站点上存在的名称数据。
好的 类似于值元组和匿名类型,但是可以在签名和中使用,以向内传递到库中。因此,C#9为您提供了记录:
Item2
对于拥有成员record Foo(int Id, string Name);
和class Foo
且拥有所有构造函数和相等性位的int Id {get;}
来说,这是简写。