[C#7] 1.Tuples(元組)。本站提示廣大學習愛好者:([C#7] 1.Tuples(元組))文章只能為提供參考,不一定能成為您想要的結果。以下是[C#7] 1.Tuples(元組)正文
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 var fullName = GetFullName(); 6 7 Console.WriteLine(fullName.Item1);// Item1,2,3不能忍,,, 8 Console.WriteLine(fullName.Item2); 9 Console.WriteLine(fullName.Item3); 10 } 11 static Tuple<string, string, string> GetFullName() => new Tuple<string, string, string>("first name", "blackheart", "last name"); 12 }
在有些場景下,我們需要一個方法返回一個以上的返回值,微軟在.NET 4中引入了Tuple這個泛型類,可以允許我們返回多個參數,每個參數按照順序被命名為 Item1;Item2,Item3 ,算是部分的解決了我們的問題,但是對於強迫症程序員來說,Item1,2,3的命名簡直是不能忍的,,,so,在C#7中,引入了一個新的泛型類型ValueTuple<T>來解決這個問題,這個類型位於一個單獨的dll(System.ValueTuple)中,可以通過nuget來引入到你當前的項目中(https://www.nuget.org/packages/System.ValueTuple/)。
2. ValueTuple不廢話,直接看代碼:
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 var fullName = GetFullName(); 6 7 Console.WriteLine(fullName.First); // 終於可以不是Item1,2,3了,,, 8 Console.WriteLine(fullName.Middle); 9 Console.WriteLine(fullName.Last); 10 } 11 12 static (string First, string Middle, string Last) GetFullName() => ("first name", "blackheart", "last name"); 13 }
看出來差別了嗎?我們終於可以用更直觀的名字來替換掉該死的"Item1,2,3"了,看起來很棒吧。但是貌似我們並沒有用到上面我提到的System.ValueTuple,我們翻開編譯後的程序集看看:
1 internal class Program 2 { 3 private static void Main(string[] args) 4 { 5 ValueTuple<string, string, string> fullName = Program.GetFullName(); 6 Console.WriteLine(fullName.Item1); // 原來你還是Item1,2,3,,,FUCK!!! 7 Console.WriteLine(fullName.Item2); 8 Console.WriteLine(fullName.Item3); 9 } 10 11 [TupleElementNames(new string[] 12 { 13 "First", 14 "Middle", 15 "Last" 16 })] 17 private static ValueTuple<string, string, string> GetFullName() 18 { 19 return new ValueTuple<string, string, string>("first name", "blackheart", "last name"); 20 } 21 }
不看不知道,一看嚇一跳,原來我們的 fullName.First; 編譯後居然還是 fullName.Item1 ,真是日了狗了。。。
不同之處在於GetFullName這個方法,編譯器把我們簡化的語法形式翻譯成了 ValueTuple<string, string, string> ,還給加了一個新的Attribute(TupleElementNamesAttribute),然後把我們自定義的非常直觀友好的“First”,"Middle","Last"當作元數據給存起來了。TupleElementNamesAttribute和ValueTuple一樣,位於System.ValueTuple的單獨dll中。
3. 總結新的語法形式確實直觀友好了好多,but,本質依然是借助泛型類型來實現的,同時也需要編譯器對新語法形式的支持。
了解了本質是什麼東西之後,以後在項目中環境允許的話,就放心大膽的使用吧(類型ValueTuple可以出現的地方,(first,last)這種新語法形式均可以)。
參考:https://blogs.msdn.microsoft.com/dotnet/2016/08/24/whats-new-in-csharp-7-0/