1. 程式人生 > >Tuple和 ValueTuple

Tuple和 ValueTuple

通過 數量 const stat 性能問題 ring ret 優點 方法

這個類型還是學習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