文章目录
- C# 元组
- Tuple 类
- ValueTuple 类
- ValueTuple 与 Tuple的区别
- `System.ValueTuple` 类型的值是可变的
- `System.Tuple` 类型的值是不可变的
- `System.ValueTuple` 类型的数据成员是字段
- System.ValueTuple 与匿名类
- 在使用Linq查询时,如何权衡使用元组还是匿名类
- 权衡
- 主要区别
- 序列化
C# 元组
Tuple 类
程序集:System.Runtime.dll
提供用于创造元组对象的静态方法。
用法:
var primes = Tuple.Create(2, 3, 5, 7, 11, 13, 17, 19);
Console.WriteLine("Prime numbers less than 20: " +
"{0}, {1}, {2}, {3}, {4}, {5}, {6}, and {7}",
primes.Item1, primes.Item2, primes.Item3,
primes.Item4, primes.Item5, primes.Item6,
primes.Item7, primes.Rest.Item1);
// The example displays the following output:
// Prime numbers less than 20: 2, 3, 5, 7, 11, 13, 17, and 19
ValueTuple 类
提供用于创建值元组的静态方法。
用法:
(int, string) x1 = ValueTuple.Create(24, "zs");
ValueTuple 与 Tuple的区别
System.ValueTuple 类型支持的 C# 元组不同于 System.Tuple 类型表示的元组。 主要区别如下:
System.ValueTuple
类型是值类型。System.Tuple
类型是引用类型。System.ValueTuple
类型的值是可变的。System.Tuple
类型的值是不可变的。System.ValueTuple
类型的数据成员是字段。System.Tuple
类型的数据成员是属性。
System.ValueTuple
类型的值是可变的
什么是可变的呢,其实就是可以get和set,举例说明,下面这段代码是不会出现错误提示的
var person = ( 24, "张三");
person.Item1 = 3;
System.Tuple
类型的值是不可变的
这个类型的属性是只读的(get),举例说明
System.ValueTuple
类型的数据成员是字段
数据字段就是可以给字段取一个名字,而System.Tuple
只能用Item1,Item2这样的方式进行获取
举例
var person = (age: 24, name: "张三");
person.age = 3;
System.ValueTuple 与匿名类
搞c#的都知道匿名类,比如 var x = new {Name="张三",Age=24}
这样一段代码就是new了一个匿名对象
对比匿名类和元组的区别
- 语法区别,元组使用的是小括号,匿名类使用的是花括号
- 关键字区别,元组不需要使用关键字new,匿名类需要使用关键字new
- 类型区别,元组(特指ValueTuple)是值类型,匿名类(对象)是引用类型
在使用Linq查询时,如何权衡使用元组还是匿名类
权衡
你可能希望始终使用 ValueTuple(而不是 Tuple)和匿名类型,但应进行一些权衡考虑。 ValueTuple 类型是可变的,而 Tuple 是只读的。 匿名类型可用于表达式树,而元组不行。 下表概述了一些关键区别。
主要区别
“属性” | 访问修饰符 | 类型 | 自定义成员名称 | 析构支持 | 表达式树支持 |
---|---|---|---|---|---|
匿名类型 | internal | class | ✔️ | ❌ | ✔️ |
Tuple | public | class | ❌ | ❌ | ✔️ |
ValueTuple | public | struct | ✔️ | ✔️ | ❌ |
序列化
选择类型时的一个重要考量是,是否需要对其进行序列化。 序列化是将对象状态转换为可保持或传输的形式的过程。 有关详细信息,请参阅序列化。 当序列化非常重要时,创建 class
或 struct
优于使用匿名类型或元组类型。
https://learn.microsoft.com/zh-cn/dotnet/standard/base-types/choosing-between-anonymous-and-tuple
https://learn.microsoft.com/zh-cn/dotnet/api/system.valuetuple?view=net-7.0
https://learn.microsoft.com/zh-cn/dotnet/csharp/language-reference/builtin-types/value-tuples#tuples-vs-systemtuple
https://learn.microsoft.com/zh-cn/dotnet/api/system.tuple?view=net-7.0#code-try-1