C# 元组

文章目录

  • 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),举例说明

C# 元组_第1张图片

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 ✔️ ✔️
序列化

选择类型时的一个重要考量是,是否需要对其进行序列化。 序列化是将对象状态转换为可保持或传输的形式的过程。 有关详细信息,请参阅序列化。 当序列化非常重要时,创建 classstruct 优于使用匿名类型或元组类型。

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

你可能感兴趣的:(NetCore,c#,开发语言)