Tuple和 ValueTuple
阿新 • • 發佈:2019-01-30
通過 數量 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
類將其屬性命名為 Item1
、Item2
等。 這些名稱未承載任何語義信息。 使用這些 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