Tuple和 ValueTuple

Posted sea1ee

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Tuple和 ValueTuple相关的知识,希望对你有一定的参考价值。

这个类型还是学习C#7.0的语法在看到的,这边单独拿来学习下。

学习地址:

https://docs.microsoft.com/zh-cn/dotnet/csharp/tuples 

https://docs.microsoft.com/zh-cn/dotnet/csharp/deconstruct

C# 元组是使用轻量语法定义的类型,是一个泛型 。 其优点包括:更简单的语法,基于元素数量(称为“基数”)和元素类型的转换规则,以及一致的副本、相等测试和赋值规则。 

缺点:Tuple 类将其属性命名为 Item1Item2 等。 这些名称未承载任何语义信息。 使用这些 Tuple 类型无法表达各属性的含义。Tuple 类因其引用类型会导致更多性能问题。

在C#7.0和7.1的语法中新增了一些功能,改善了这些缺点。

 

普通的Tuple

var tuple = new Tuple<int, int,string>(1, 2,"hello");
            Console.WriteLine(tuple.Item1);
            Console.WriteLine(tuple.Item2);
            Console.WriteLine(tuple.Item3);

新的元组 ValueTuple (这个需要你去安装nuget包)

  //需要我们在nuget上安装 System.ValueTuple
            var tuple = (1, 2);
            var tuple2 = ValueTuple.Create(1, 2);  
            var tuple3 = new ValueTuple<int, int>(1, 2);

            Console.WriteLine($"{tuple.Item1}and{tuple.Item2}");

 

 从 C# 7.1 开始,元组的字段名称可能会通过用于初始化此元组的变量提供。我们可以使用字段名称来代替 Item1,Item2

ps: 设置查看项目的语言版本:项目——属性——生存——高级——语言版本

        var named = (first: "one", second: "two");
            Console.WriteLine($"{named.first}");   //7.0
            var sum = 12.5;
            var count = 5;
            var accumulation = (count, sum);
            Console.WriteLine($"{accumulation.count}");   //需要我们的语言版本是7.1

 

        (int a, int b) nullableTuple = (9, 8);  //左边命名
            Console.WriteLine(nullableTuple.a);
            (int a, int b) nullableTuple2 = (one: 9, two: 8);  //左右两边命名,右边的命名会被忽略

 

 

     //valueType作返回值
            var tt = TestValueTuple();
            Console.WriteLine(tt.i);

            (int i, int j) = TestValueTuple();
            Console.WriteLine(i);

            var (z, x) = TestValueTuple();
            Console.WriteLine(z);
           public static (int i, int j) TestValueTuple()
        {
            return (8, 9);
        }

 

Deconstruct 析构该类型的实例   (只能是这个名称),Deconstruct还可以写成扩展方法
        public class Person
        {
            public string FirstName { get; set; }
            public string MiddleName { get; set; }
            public string LastName { get; set; }
            public string City { get; set; }
            public string State { get; set; }

            public Person(string fname, string mname, string lname,
                          string cityName, string stateName)
            {
                FirstName = fname;
                MiddleName = mname;
                LastName = lname;
                City = cityName;
                State = stateName;
            }

            // Return the first and last name.
            public void Deconstruct(out string fname, out string lname)
            {
                fname = FirstName;
                lname = LastName;
            }

            public void Deconstruct(out string fname, out string mname, out string lname)
            {
                fname = FirstName;
                mname = MiddleName;
                lname = LastName;
            }

            public void Deconstruct(out string fname, out string lname,
                                    out string city, out string state)
            {
                fname = FirstName;
                lname = LastName;
                city = City;
                state = State;
            }         
        }

 

 Person p = new Person("John", "Quincy", "Adams", "Boston", "MA");

            //他会根据你的前面的参数个数自动去匹配Deconstruct重载
            (string fName, string lName, string city, string state) = p;
            Console.WriteLine($"Hello {fName} {lName} of {city}, {state}!");

            (string name, string lname) = p;
            Console.WriteLine($"{name}");

 

以上是关于Tuple和 ValueTuple的主要内容,如果未能解决你的问题,请参考以下文章

Tuple和 ValueTuple

详解C# Tuple VS ValueTuple(元组类 VS 值元组)

详解C# Tuple VS ValueTuple(元组类 VS 值元组)

详解C# Tuple VS ValueTuple(元组类 VS 值元组)

我们应该将 Tuple 或 ValueTuple 用于仅引用类型的变量吗?

C#关键字扫盲——Tuple(元组类) ValueTuple(值元组)