Home  >  Article  >  Backend Development  >  C#Tuples (Tuples)

C#Tuples (Tuples)

PHPz
PHPzOriginal
2017-03-12 15:47:291302browse

1. Old version code


 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 }

In some scenarios, we need a method to return more than one return value. Microsoft introduced Tuple in .NET 4 Generic classes allow us to return multiple parameters. Each parameter is named Item1;Item2,Item3 in order. This partially solves our problem, but for programmers with obsessive-compulsive disorder, The naming of Item1,2,3 is simply intolerable,,,so, in C#7, a new generic type ValueTuple was introduced to solve this problem. This type is located in a separate The dll (System.ValueTuple) can be introduced into your current project through nuget (http://www.php.cn/).

2. ValueTuple

No nonsense, just look at the code:


 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 }

Do you see the difference? We can finally replace the damn "Item1,2,3" with more intuitive names, looks great. But it seems that we have not used the System.ValueTuple I mentioned above. Let’s open the compiled assembly and take a look:


 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 }

If you don’t know, take a look. I was shocked to find that our fullName.First; turned out to be fullName.Item1 after compilation. It was really a shame. . .

The difference lies in the GetFullName method. The compiler translates our simplified syntax form into ValueTuple<string, string, string>, also added a new Attribute (TupleElementNamesAttribute), and then defined our very intuitive and friendly "First", "Middle", "Last "Saved as metadata (If it is only used locally, such metadata will not be added). TupleElementNamesAttributeSame as ValueTuple, located in a separate dll of System.ValueTuple.

3. Example


 1 class Program 2 { 3     static void Main(string[] args) 4     { 5         var range = (first: 1, end: 10); 6         //也可以这样写,效果是一样的,编译后都是没有了first,end的痕迹,,,first和end只是语法层面的障眼法 7         //(int first, int last) range = (1, 10); 8         Console.WriteLine(range.first); 9         Console.WriteLine(range.end);10 11         //可以使用var,这种无显示声明一个变量的方式会编译出多余的代码,慎用,不知是不是还未优化好。12         (var begin, var end) = (DateTime.Parse("2017-1-1"), DateTime.Parse("2017-12-31"));13         Console.WriteLine(begin);14         Console.WriteLine(end);15 16         //begin,end可以被覆盖重命名为startDate和endDate,但是会有一个编译警告,提示名字被忽略掉了。17         //warning CS8123: The tuple element name 'begin' is ignored because a different name is specified by the target type '(DateTime startDate, DateTime endDate)'18         //warning CS8123: The tuple element name 'end' is ignored because a different name is specified by the target type '(DateTime startDate, DateTime endDate)‘19         (DateTime startDate, DateTime endDate) timeSpan = (begin: DateTime.Parse("2017-1-1"), end: DateTime.Parse("2017-12-31"));20         Console.WriteLine(timeSpan.startDate);21         Console.WriteLine(timeSpan.endDate);22     }23 }
Look at the compiled code:


 1 private static void Main(string[] args) 2 { 3     ValueTuple<int, int> range = new ValueTuple<int, int>(1, 10); 4     Console.WriteLine(range.Item1); 5     Console.WriteLine(range.Item2); 6     ValueTuple<DateTime, DateTime> expr_3C = new ValueTuple<DateTime, DateTime>(DateTime.Parse("2017-1-1"), DateTime.Parse("2017-12-31"));
 7     DateTime item = expr_3C.Item1;
 8     DateTime item2 = expr_3C.Item2;
 9     DateTime begin = item;
10     DateTime end = item2;11     Console.WriteLine(begin);12     Console.WriteLine(end);13     ValueTuple<DateTime, DateTime> timeSpan = new ValueTuple<DateTime, DateTime>(DateTime.Parse("2017-1-1"), DateTime.Parse("2017-12-31"));14     Console.WriteLine(timeSpan.Item1);15     Console.WriteLine(timeSpan.Item2);16 }
Note

(var begin, var end) = (DateTime.Parse("2017-1- 1"), DateTime.Parse("2017-12-31")); This line The cheap result looks very bad (the red part in lines 6-10 above). It may be a problem of insufficient compilation optimization (the same is true for release compilation).

4.

Summary

The new syntax form is indeed much more intuitive and friendly, but the essence is still implemented with the help of generic types, and it also requires the compiler to Support for new syntax forms.

After understanding what the essence is, if the environment allows it in the future, feel free to use it boldly (

Where the type ValueTuple can appear, (first, last) this new The grammatical form can be ).

The above is the detailed content of C#Tuples (Tuples). For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Previous article:C# exception enhancementNext article:C# exception enhancement