Inhaltsverzeichnis
1. Alter Versionscode
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. " >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.

C#-Tupel (Tupel)

Mar 12, 2017 pm 03:47 PM
c#

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 }
Nach dem Login kopieren

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 }
Nach dem Login kopieren
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 }
Nach dem Login kopieren
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 }
Nach dem Login kopieren


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 }
Nach dem Login kopieren
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!

Erklärung dieser Website
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

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Chat -Befehle und wie man sie benutzt
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Active Directory mit C# Active Directory mit C# Sep 03, 2024 pm 03:33 PM

Leitfaden zu Active Directory mit C#. Hier besprechen wir die Einführung und die Funktionsweise von Active Directory in C# sowie die Syntax und das Beispiel.

C#-Serialisierung C#-Serialisierung Sep 03, 2024 pm 03:30 PM

Leitfaden zur C#-Serialisierung. Hier besprechen wir die Einführung, die Schritte des C#-Serialisierungsobjekts, die Funktionsweise bzw. das Beispiel.

Zufallszahlengenerator in C# Zufallszahlengenerator in C# Sep 03, 2024 pm 03:34 PM

Leitfaden zum Zufallszahlengenerator in C#. Hier besprechen wir die Funktionsweise des Zufallszahlengenerators, das Konzept von Pseudozufallszahlen und sicheren Zahlen.

C#-Datenrasteransicht C#-Datenrasteransicht Sep 03, 2024 pm 03:32 PM

Leitfaden zur C#-Datenrasteransicht. Hier diskutieren wir die Beispiele, wie eine Datenrasteransicht aus der SQL-Datenbank oder einer Excel-Datei geladen und exportiert werden kann.

Muster in C# Muster in C# Sep 03, 2024 pm 03:33 PM

Leitfaden zu Mustern in C#. Hier besprechen wir die Einführung und die drei wichtigsten Arten von Mustern in C# zusammen mit ihren Beispielen und der Code-Implementierung.

Primzahlen in C# Primzahlen in C# Sep 03, 2024 pm 03:35 PM

Leitfaden zu Primzahlen in C#. Hier besprechen wir die Einführung und Beispiele von Primzahlen in C# sowie die Codeimplementierung.

Fakultät in C# Fakultät in C# Sep 03, 2024 pm 03:34 PM

Leitfaden zur Fakultät in C#. Hier diskutieren wir die Einführung in die Fakultät in C# zusammen mit verschiedenen Beispielen und Code-Implementierungen.

Der Unterschied zwischen Multithreading und asynchronem C# Der Unterschied zwischen Multithreading und asynchronem C# Apr 03, 2025 pm 02:57 PM

Der Unterschied zwischen Multithreading und Asynchron besteht darin, dass Multithreading gleichzeitig mehrere Threads ausführt, während asynchron Operationen ausführt, ohne den aktuellen Thread zu blockieren. Multithreading wird für rechenintensive Aufgaben verwendet, während asynchron für die Benutzerinteraktion verwendet wird. Der Vorteil des Multi-Threading besteht darin, die Rechenleistung zu verbessern, während der Vorteil von Asynchron nicht darin besteht, UI-Threads zu blockieren. Die Auswahl von Multithreading oder Asynchron ist von der Art der Aufgabe abhängt: Berechnungsintensive Aufgaben verwenden Multithreading, Aufgaben, die mit externen Ressourcen interagieren und die UI-Reaktionsfähigkeit asynchron verwenden müssen.

See all articles