程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> [C#7] 1.Tuples(元組)

[C#7] 1.Tuples(元組)

編輯:C#入門知識

[C#7] 1.Tuples(元組)。本站提示廣大學習愛好者:([C#7] 1.Tuples(元組))文章只能為提供參考,不一定能成為您想要的結果。以下是[C#7] 1.Tuples(元組)正文


1. 老版本代碼
 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/

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved