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
不是。这反映在匿名类型公开属性,ValueTuple
s 公开字段这一事实中。数据绑定几乎总是需要属性。
大量现有代码仅适用于引用类型,不适用于值类型。特别想到的是 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" });
库将能够看到名称 Id
和 Name
,并相应地工作(提出 JSON 就像 {"Id":42,"Name":"abc"}
);然而,not value-tuples 是不可能的 - 任何图书馆,无论是使用 <T>
还是 object
或其他东西,都只会看到 Item1
、Item2
等 - 没有机制来获取存在于原始站点的名称数据。
什么是 nice 将是类似于 value-tuples 和匿名类型的简洁的东西,但可以在签名中使用 and 向内传递到图书馆;因此 C# 9 给你 records:
record Foo(int Id, string Name);
对于具有成员 int Id {get;}
和 string Name {get;}
的 class Foo
以及您期望的所有构造函数和相等位,这是 short-hand。
看着新的 C# 7.0 ValueTuples,我想知道它们是否会完全取代 Anonymous Types
。我知道 ValueTuples
是结构,因此与 Anonymous Types
的行为有点不同,后者是 类。但是,我没有看到我更喜欢使用 Anonymous Type
而不是 ValueTuple
.
在 C# 7.0 中使用 Anonymous Type
是否仍然比使用 ValueTuples
更有利?
匿名类型是不可变的,ValueTuple
不是。这反映在匿名类型公开属性,ValueTuple
s 公开字段这一事实中。数据绑定几乎总是需要属性。
大量现有代码仅适用于引用类型,不适用于值类型。特别想到的是 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" });
库将能够看到名称 Id
和 Name
,并相应地工作(提出 JSON 就像 {"Id":42,"Name":"abc"}
);然而,not value-tuples 是不可能的 - 任何图书馆,无论是使用 <T>
还是 object
或其他东西,都只会看到 Item1
、Item2
等 - 没有机制来获取存在于原始站点的名称数据。
什么是 nice 将是类似于 value-tuples 和匿名类型的简洁的东西,但可以在签名中使用 and 向内传递到图书馆;因此 C# 9 给你 records:
record Foo(int Id, string Name);
对于具有成员 int Id {get;}
和 string Name {get;}
的 class Foo
以及您期望的所有构造函数和相等位,这是 short-hand。