Heim  >  Artikel  >  Backend-Entwicklung  >  C#-Tupel (Tupel)

C#-Tupel (Tupel)

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

1. Alter Versionscode


 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 einigen Szenarien benötigen wir eine Methode, um mehr als einen Rückgabewert zurückzugeben. Microsoft hat ihn in .NET 4 Tuple eingeführt ist eine generische Klasse, die es uns ermöglicht, mehrere Parameter in der Reihenfolge Item1;Item2,Item3 zurückzugeben. Dies löst teilweise unser Problem, aber für Programmierer mit Zwangsstörungen sagte die Benennung von Item1 ,2,3 ist einfach unerträglich, daher wurde in C#7 ein neuer generischer Typ ValueTuple eingeführt, der sich in einem separaten dll (System.ValueTuple) kann über Nuget (http://www.php.cn/) in Ihr aktuelles Projekt eingeführt werden.

2. ValueTuple

Kein Unsinn, schauen Sie sich einfach den Code an:


 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 }
Können Sie den Unterschied erkennen? Endlich können wir das verdammte „Item1,2,3“ durch etwas intuitiveres ersetzen. Aber es scheint, dass wir das oben erwähnte System.ValueTuple nicht verwendet haben. Öffnen wir die kompilierte Assembly und schauen wir uns Folgendes an:


 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 }
Ich weiß nicht, ob Sie wissen es nicht. Ich war schockiert, als sich herausstellte, dass unser

fullName.First; nach der Kompilierung wirklich schlecht war. . . Der Unterschied zwischen besteht darin, dass der Compiler in der Methode GetFullName unsere vereinfachte Syntax in

ValueTuple<

string, string, übersetzt string> und außerdem ein neues Attribut (TupleElementNamesAttribute) hinzugefügt, und dann haben wir definiert das sehr intuitive und benutzerfreundliche „First“, „Middle“, „Last“ „Als Metadaten gespeichert“. (Wenn es nur lokal verwendet wird, werden solche Metadaten nicht hinzugefügt). TupleElementNamesAttribute ist dasselbe wie ValueTuple und befindet sich in einer separaten DLL von System.ValueTuple.

3. Beispiel


Sehen Sie sich den kompilierten Code an:

 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 }


Hinweis

(
 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 }
var

begin, var end) = (DateTime.Parse(" 2017 -1-1"), DateTime.Parse("2017-12-31")); Das billige Ergebnis dieser Zeile sieht sehr schlecht aus (der rote Teil der Zeilen 6-10 oben). Möglicherweise liegt ein Problem unzureichender Kompilierungsoptimierung vor (dasselbe gilt für die Release-Kompilierung). 4. Zusammenfassung

Die neue Syntaxform ist zwar viel intuitiver und benutzerfreundlicher, aber das Wesentliche wird immer noch mit Hilfe generischer Typen implementiert, und der Compiler ist es auch ist außerdem für die Unterstützung neuer Syntaxformen erforderlich.

Nachdem Sie verstanden haben, was das Wesentliche ist, können Sie es gerne mutig verwenden, wenn die Umgebung es in Zukunft zulässt (

Wo der Typ ValueTuple erscheinen kann, (zuerst, zuletzt) ​​dieses neue Any Die grammatikalische Form kann

sein.

Das obige ist der detaillierte Inhalt vonC#-Tupel (Tupel). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Vorheriger Artikel:C#-AusnahmeerweiterungNächster Artikel:C#-Ausnahmeerweiterung