Die Geschichte von C#
Dieser Artikel erläutert den Verlauf jeder Hauptversion der Sprache C#. Das C#-Team entwickelt und ergänzt immer neue und innovative Features. Informationen zu den Status von Programmiersprachenfunktionen, so auch Funktionen, die für zukünftige Versionen geplant sind, finden Sie im dotnet/roslyn-Repository auf GitHub.
Wichtig
Für einige der Features nutzt die Sprache C# Typen und Methoden in einer Struktur, die in der C#-Spezifikation als Standardbibliothek bezeichnet wird. Die .NET-Plattform stellt diese Typen und Methoden in verschiedenen Paketen bereit. Ein Beispiel ist die Ausnahmeverarbeitung. Alle throw-Anweisungen oder -Ausdrücke werden überprüft, um sicherzustellen, dass das ausgelöste Objekt von Exception abgeleitet ist. Auf ähnliche Weise wird jedes catch überprüft, um sicherzustellen, dass der abgefangen Typ von Exception abgeleitet ist. Jede Version kann neue Anforderungen hinzufügen. Um die neuesten Sprachfunktionen in älteren Umgebungen verwenden zu können, müssen Sie vielleicht bestimmte Bibliotheken installieren. Diese Abhängigkeiten werden auf der jeweiligen Seite für eine spezifische Version dokumentiert. Sie können mehr über die Beziehungen zwischen Sprache und Bibliothek erfahren, um Hintergrundinformationen zu dieser Abhängigkeit zu erhalten.
C# Version 1.0
Die mit Visual Studio .NET 2002 veröffentlichte C#-Version 1.0 ähnelte Java sehr stark. Als Teil seiner angegebenen Entwurfsziele für ECMA wollte es eine "einfache, moderne, allgemeine objektorientierte Sprache" sein. Zum Zeitpunkt bedeutete java, dass es diese frühen Designziele erreicht hat.
Wenn Sie sich C# 1.0 jedoch heute ansehen, wird Ihnen schwindlig. Es fehlten die integrierten Async-Funktionen und einige der cleveren Funktionen bezüglich Generics, die heute als selbstverständlich betrachtet werden. In der Tat fehlten Generics vollständig. Und was ist mit LINQ? War noch nicht verfügbar. Bis zum Erscheinen dieser Erweiterungen dauerte es noch einige Jahre.
Im Vergleich zu heute sieht C# Version 1.0 jedoch ziemlich minimalistisch aus. Man musste selbst ausführlichen Code schreiben. Irgendwo musste man jedoch anfangen. C# Version 1.0 war eine brauchbare Alternative zu Java auf der Windows-Plattform.
Die wichtigsten Features von C# 1.0 umfassten:
- Klassen
- Strukturen
- Schnittstellen
- Ereignisse
- Eigenschaften
- Delegaten
- Operatoren und Ausdrücke
- Anweisungen
- Attribute
C# Version 1.2
C# Version 1.2 wird in Visual Studio. NET 2003 bereitgestellt. Sie enthielt einige kleine Verbesserungen der Sprache. Die wichtigste Änderung betrifft, ab dieser Version, den in einer foreach-Schleife namens Dispose generierten Code in IEnumerator, wenn IEnumeratorIDisposable implementiert hat.
C# Version 2.0
Nun wird es langsam interessant. Werfen wir einen Blick auf einige wichtige Features von C# 2.0, die im Jahr 2005 zusammen mit Visual Studio 2005 veröffentlicht wurden:
- Generics
- Partial types (Partielle Typen)
- Anonyme Methoden
- Auf NULL festlegbare Werttypen
- Iteratoren
- Kovarianz und Kontravarianz
Andere Features von C# 2.0 fügten vorhandenen Features Funktionen hinzu:
- Separate Getter- und Setter-Zugriffsfunktionen
- Konvertierung von Methodengruppen (Delegate)
- Statische Klassen
- Delegatrückschlüsse
C# mag als allgemein gehaltene, objektorientierte (OO) Sprache angefangen haben. Das änderte sich mit C# Version 2.0 jedoch schnell. Sobald man diese im Griff hatte, widmete man sich einigen ernsten Problemfeldern der Entwickler. Und zwar in bedeutungsvoller Art und Weise.
Mit Generics können Typen und Methoden für einen beliebigen Typ ausgeführt werden, und sie behalten dennoch ihre Typsicherheit bei. Wenn Sie zum Beispiel List<T> haben, können Sie List<string> oder List<int> verwenden und typsichere Vorgänge für diese Zeichenfolgen oder Ganzzahlen ausführen, während Sie sie durchlaufen. Die Verwendung von Generischen ist besser als das Erstellen eines ListInt Typs, der von ArrayList jedem Vorgang abgeleitet oder von einem Casting abgeleitet Object wird.
C# Version 2.0 brachte Iteratoren mit sich. Kurz gesagt können Sie mit Iteratoren alle Elemente in einem List (oder anderen Enumerable-Typen) mit einer foreach-Schleife untersuchen. Als erstklassiger Bestandteil der Sprache verbesserten Iteratoren die Lesbarkeit der Sprache und die Möglichkeiten zum Erörtern des Codes erheblich.
Trotzdem hinkte C# weiter ein wenig hinter Java her. Von Java gab es bereits Versionen mit Generics und Iteratoren. Das sollte sich jedoch bald ändern, da sich die Sprachen weiter voneinander weg entwickelten.
C# Version 3.0
C# Version 3.0 wurde Ende 2007 zusammen mit Visual Studio 2008 veröffentlicht. Der volle Umfang an Sprachfeatures kam tatsächlich jedoch erst mit .NET Framework Version 3.5. Diese Version markierte eine wesentliche Veränderung in der Entwicklung von C#. Sie etablierte C# als eine wirklich beachtliche Programmiersprache. Werfen wir einen Blick auf einige wichtige Features in dieser Version:
- Automatisch implementierte Eigenschaften
- Anonyme Typen
- Query expressions (Abfrageausdrücke)
- Lambda-Ausdrücke
- Ausdrucksbaumstrukturen
- Erweiterungsmethoden
- Implizit typisierte lokale Variablen
- Partielle Methoden
- Objekt- und Elementinitialisierer
Rückblickend scheinen viele dieser Features unvermeidlich und untrennbar. Sie alle passen strategisch zusammen. Es wird angenommen, dass das durchschlagende Feature dieser Version von C# der Abfrageausdruck war, auch bekannt als Language Integrated Query (LINQ).
Bei genauerem Hinsehen zeigt sich, dass Ausdrucksbaumstrukturen, Lambdaausdrücke und anonyme Typen die Grundlage waren, auf der LINQ konstruiert wurde. In jedem Fall stellte C# 3.0 ein revolutionäres Konzept dar. C# 3.0 hatte mit dem Schaffen der Grundlagen begonnen, um C# in eine hybride objektorientierte/funktionale Sprache zu verwandeln.
Konkret konnte man nun deklarative Abfragen im Stil von SQL schreiben, unter anderem um Vorgänge an Sammlungen durchzuführen. Anstatt eine for-Schleife zu schreiben, um den Durchschnitt einer Liste von ganzen Zahlen zu berechnen, konnte man dies nun einfach als list.Average() ausführen. Die Kombination aus Abfrageausdrücken und Erweiterungsmethoden ließ es jedoch so aussehen, als wäre die Liste der ganzen Zahlen sehr viel intelligenter geworden.
Es dauerte eine Weile, aber nach und nach verstanden die Menschen das Konzept wirklich und integrierten es. Und nun, Jahre später, ist der Code sehr viel präziser, einfacher und funktionaler.
C# Version 4.0
Die C#-Version 4.0, die mit Visual Studio 2010 veröffentlicht wurde, konnte nicht an den Erfolg der Version 3.0 anknüpfen. Mit Version 3.0 bewegte sich C# deutlich aus dem Schatten von Java heraus und gewann an Bedeutung. Die Sprache wurde schnell elegant.
Die nächste Version führte einige interessante neue Features ein:
- Dynamische Bindung
- Benannte/optionale Argumente
- Generische Kovarianz und Kontravarianz
- Eingebettete Interop-Typen
Durch eingebettete Interop-Typen wird die Bereitstellung von COM-Interopassemblys für Ihre Anwendung vereinfacht. Generische Kovarianz und Kontravarianz bieten Ihnen mehr Möglichkeiten zum Verwenden von Generics. Sie sind allerdings recht theoretisch und werden vermutlich von Framework- und Bibliotheksautoren am meisten geschätzt. Mit benannten und optionalen Parametern können Sie Methodenüberladungen eliminieren. Außerdem bieten sie Bequemlichkeit. Keines dieser Features war jedoch bahnbrechend.
Das wichtigste Feature war die Einführung des dynamic-Schlüsselworts. Das in C# Version 4.0 eingeführte dynamic-Schlüsselwort gibt die Möglichkeit zum Überschreiben des Compilers bei Eingabe zur Kompilierzeit. Durch die Verwendung des dynamischen Schlüsselworts können Sie Konstrukte schreiben, die dynamisch typisierten Sprachen wie JavaScript ähneln. Sie können ein dynamic x = "a string" erstellen und dann sechs hinzufügen, und überlassen Sie es der Runtime herauszufinden, was als Nächstes geschehen soll.
Die dynamische Bindung kann zu Fehlern führen, bietet aber gleichzeitig eine hohe Leistungsfähigkeit innerhalb der Sprache.
C# Version 5.0
In der C#-Version 5.0, die mit Visual Studio 2012 veröffentlicht wurde, lag der Fokus auf ganz bestimmten Sprachaspekten. Nahezu die gesamte Arbeit für diese Version war einem weiteren bahnbrechenden Sprachkonzept gewidmet: den Modellen async und await für die asynchrone Programmierung. Hier ist die Liste der wichtigsten Features:
Siehe auch
- Code Project: Caller Info Attributes in C# 5.0 (Aufruferinformationsattribute in C# 5.0)
Mit dem Attribut „CallerInfo“ können Sie leicht Informationen über den Kontext erhalten, in dem Sie ausführen, ohne auf Dutzende Reflektionscodebausteine zurückzugreifen. Es gibt viele Verwendungsmöglichkeiten für Diagnose- und Protokollierungsaufgaben.
Die eigentlichen Stars dieser Version sind aber async und await. Als diese Features im Jahr 2012 herauskamen, veränderte C# noch einmal alles, indem Asynchronität als erstrangiger Bestandteil in die Sprache eingearbeitet wurde. Wenn Sie schon einmal mit langlaufenden Vorgängen und der Implementierung von Rückrufnetzen zu tun hatten, haben Sie dieses Sprachfeature vermutlich zu schätzen gelernt.
C# Version 6.0
Mit den Versionen 3.0 und 5.0 wurde C# um wichtige neue Features in einer objektorientierten Sprache erweitert. In Version 6.0, die mit Visual Studio 2015 veröffentlicht wurde, lag der Fokus nicht auf einem einzelnen Hauptfeature, sondern auf der Implementierung vieler kleiner Verbesserungen, die das Programmieren mit C# noch effizienter machten. Hier sind einige davon:
- Statische Importe
- Ausnahmefilter
- Initialisierer für automatische Eigenschaften
- Ausdruckskörpermember
- Nullpropagator
- Zeichenfolgeninterpolation
- nameof-Operator
Zu weiteren neuen Features gehören:
- Indexinitialisierer
- „Await“ in Catch- und Finally-Blöcken
- Standardwerte für Getter-exklusive Eigenschaften
Jedes dieser Features ist auf seine eigene Weise interessant. Wenn Sie die Features jedoch zusammen betrachten, erkennen Sie ein interessantes Muster. In dieser Version von C# wurden Codebausteine eliminiert, um den Code knapper und besser lesbar zu machen. Für Anhänger von klarem, einfachem Code war diese Sprachversion ein großer Gewinn.
Neben dieser Version wurde noch etwas anderes gemacht, auch wenn es sich nicht um ein herkömmliches Sprachfeature handelt. Der Compiler Roslyn wurde als Dienst veröffentlicht. Der C#-Compiler ist nun in C# geschrieben, und Sie können den Compiler als Teil Ihrer Programmierarbeiten verwenden.
C# Version 7.0
Die C#-Version 7.0 wurde mit Visual Studio 2017 veröffentlicht. Diese Version bietet einige evolutionäre und tolle Aspekte im Stil von C# 6.0, aber ohne den Compiler als Dienst. Hier sind einige der neuen Features:
- Out-Variablen
- Tupel und Dekonstruktionen
- Mustervergleich
- Lokale Funktionen
- Erweiterte Ausdruckskörpermember
- Lokale ref-Variablen und Rückgaben
Weitere Features umfassten:
- Verwerfen
- Binäre Literale und Zahlentrennzeichen
- Throw expressions (Throw-Ausdrücke)
Alle diese Features bieten tolle neue Möglichkeiten für Entwickler und erlauben es, einen noch saubereren Code als je zuvor zu schreiben. Ein Highlight ist das Verdichten der Variablendeklaration zur Verwendung mit dem out-Schlüsselwort und indem die Rückgabe mehrerer Werte über Tupel erlaubt wird.
C# kommt auf einem immer breiteren Feld zum Einsatz. .NET Core zielt nun auf alle Betriebssysteme ab und konzentriert sich stark auf die Cloud und auf Portabilität. Diese neuen Funktionen nehmen zusätzlich zum Entwickeln neuer Features sicherlich viel Arbeit und Zeit in Anspruch.
C#-Version 7.1
Die Punktreleases von C# wurden mit C# 7.1 eingeführt. Mit dieser Version wurde das Konfigurationselement zur Auswahl der Sprachversion, drei neue Sprachfeatures und neues Compilerverhalten hinzugefügt.
Die neuen Sprachfeatures in diesem Release umfassen:
asyncMainMethode- Der Einstiegspunkt für eine Anwendung kann über den Modifizierer
asyncverfügen.
- Der Einstiegspunkt für eine Anwendung kann über den Modifizierer
defaultLiterale Ausdrücke- Sie können literale Standardausdrücke in Standardwertausdrücken verwenden, wenn der Zieltyp abgeleitet werden kann.
- Abgeleitete Tupelelementnamen
- Die Namen von Tupelelementen können in den meisten Fällen von der Initialisierung eines Tupels abgeleitet werden.
- Musterabgleich für generische Typparameter
- Sie können Musterabgleichsausdrücke für Variablen verwenden, deren Typ ein generischer Typparameter ist.
Außerdem verfügt der Compiler über die zwei Optionen -refout und -refonly, mit denen die Generierung der Referenzassembly gesteuert wird.
C#-Version 7.2
Mit C# 7.2 wurden einige kleine Sprachfeatures hinzugefügt:
- Initialisierer für
stackalloc-Arrays. - Verwenden Sie
fixed-Anweisungen mit jedem Typ verwenden, der ein Muster unterstützt. - Greifen Sie auf feste Felder ohne Anheften zu.
- Weisen Sie lokale
ref-Variablen neu zu. - Deklarieren Sie
readonly struct-Typen, um anzugeben, dass eine Struktur unveränderlich ist und ihren Membermethoden alsin-Parameter übergeben werden sollte. - Fügen Sie den
in-Modifizierer für Parameter zur Angabe hinzu, dass ein Argument durch Verweis übergeben, von der aufgerufenen Methode aber nicht verändert wird. - Verwenden Sie den
ref readonly-Modifizierer für die Methodenrückgabe, um anzugeben, dass eine Methode ihren Wert als Verweis zurückgibt und keinen Schreibzugriff auf dieses Objekt zulässt. - Deklarieren Sie
ref struct-Typen, um anzugeben, dass ein Strukturtyp direkt auf verwalteten Arbeitsspeicher zugreift und immer über einen Stapel zugeordnet werden muss. - Verwenden Sie zusätzliche generische Einschränkungen.
- Nicht schließende benannte Argumente
- Positionelle Argumente können auf benannte Argumente folgen.
- Führende Unterstriche in numerischen Literalen
- Numerische Literale dürfen jetzt führende Unterstriche vor aufgeführten Stellen aufweisen.
private protected-Zugriffsmodifizierer- Der
private protected-Zugriffsmodifizierer ermöglicht den Zugriff für abgeleitete Klassen innerhalb der gleichen Assembly.
- Der
- Bedingte
refAusdrücke- Das Ergebnis eines bedingten Ausdrucks (
?:) kann jetzt ein Verweis sein.
- Das Ergebnis eines bedingten Ausdrucks (
C#-Version 7.3
Es gibt zwei Hauptdesigns in der C# 7.3-Version. Ein Design bietet Features, die ermöglichen, dass sicherer Code so leistungsfähig ist wie unsicherer Code. Das zweite Design bietet inkrementelle Verbesserungen vorhandener Funktionen. In diesem Release wurden auch neue Compileroptionen hinzugefügt.
Die folgenden neuen Features unterstützen das Design der besseren Leistung für sicheren Code:
- Sie können ohne Anheften auf feste Felder zugreifen.
- Sie können
referneut lokale Variablen zuweisen. - Sie können Initialisierer auf
stackalloc-Arrays verwenden. - Sie können
fixed-Anweisungen mit jedem Typ verwenden, der ein Muster unterstützt. - Sie können generischere Einschränkungen verwenden.
Die folgenden Verbesserungen wurden an vorhandenen Features vorgenommen:
- Sie können
==und!=mit Tupeltypen testen. - Sie können Ausdrucksvariablen an mehreren Standorten verwenden.
- Sie können Attribute dem Unterstützungsfeld automatisch implementierter Eigenschaften anfügen.
- Die Auflösung der Methode, wenn Argumente um
indifferieren, wurde verbessert. - Die Auflösung von Überladungen weist jetzt weniger mehrdeutige Fälle auf.
Die neuen Compileroptionen lauten:
-publicsign, um das Signieren von Assemblys durch Open Source Software (OSS) zu ermöglichen.-pathmap, um eine Zuordnung für Quellverzeichnisse bereitzustellen.
C#-Version 8.0
C# 8.0 ist das erste Hauptrelease von C#, das speziell auf .NET Core ausgerichtet ist. Einige Features nutzen neue CLR-Funktionen, während andere Bibliothekstypen nutzen, die nur in .NET Core hinzugefügt wurden. C# 8.0 fügt der Sprache C# die folgenden Features und Verbesserungen hinzu:
- Readonly-Member
- Standardschnittstellenmethoden
- Verbesserungen am Musterabgleich:
- using-Deklarationen
- Statische lokale Funktionen
- Verwerfbare Referenzstrukturen
- Nullwerte zulassende Verweistypen
- Asynchrone Streams
- Indizes und Bereiche
- NULL-Coalescing-Zuweisung
- Nicht verwaltete konstruierte Typen
- Stackalloc in geschachtelten Ausdrücken
- Erweiterung von interpolierten ausführlichen Zeichenfolgen
Standardschnittstellenmember erfordern Verbesserungen in der CLR (Common Language Runtime). Diese Features wurden in der CLR für .NET Core 3.0 hinzugefügt. Bereiche, Indizes und asynchrone Datenströme erfordern neue Typen in den .NET Core 3.0-Bibliotheken. Nullable-Verweistypen, die im Compiler implementiert sind, sind weitaus nützlicher, wenn Bibliotheken mit Anmerkungen versehen sind, um semantische Informationen zum NULL-Status von Argumenten und Rückgabewerten anzugeben. Diese Anmerkungen werden in den .NET Core-Bibliotheken hinzugefügt.
C#-Version 9
C# 9 wurde mit .NET 5 veröffentlicht. Es ist die Standardsprachversion für jede Assembly, die auf das .NET 5-Release ausgelegt ist. Es enthält die folgenden neuen und verbesserten Features:
- Datensätze
- init-only-Setter
- Top-Level-Anweisungen
- Verbesserungen am Musterabgleich:
- Leistung und Interop
- Anpassen und Fertigstellen von Features
- Unterstützung für Code-Generatoren
C# 9 setzt drei der Themen aus früheren Versionen fort: Entfernen von Aufwand, Trennen von Daten und Algorithmen sowie Bereitstellen von mehr Mustern an mehr Stellen.
Anweisungen der obersten Ebene bedeuten, dass das Hauptprogramm einfacher zu lesen ist. Es besteht weniger Aufwand: ein Namespace, die Program-Klasse und static void Main() sind nicht erforderlich.
Die Einführung von records ermöglicht eine kompakte Syntax für Verweistypen, die der Wertsemantik für Gleichheit folgen. Mit diesen Typen definieren Sie Datencontainer, die typischerweise ein Mindestverhalten festlegen. init-only-Setter ermöglichen nicht destruktive Mutationen with (Ausdrücke) in Datensätzen. C# 9 fügt auch kovariante Rückgabetypen hinzu, sodass abgeleitete Datensätze virtuelle Methoden überschreiben und einen Typ zurückgeben können, der vom Rückgabetyp der Basismethode abgeleitet ist.
Die Möglichkeiten zum Musterabgleich wurden auf verschiedene Weisen erweitert. Numerische Typen unterstützen jetzt Bereichsmuster. Muster können mit den Mustern and, or und not kombiniert werden. Klammern können hinzugefügt werden, um komplexere Muster zu verdeutlichen.
Eine weitere Reihe von Features unterstützt High Performance Computing in C#:
- Die Typen
nintundnuintmodellieren die Integertypen mit nativer Größe auf der Ziel-CPU. - Funktionszeiger stellen delegatähnliche Funktionen zur Verfügung und vermeiden gleichzeitig die Zuteilungen, die zum Erstellen eines Delegatobjekts erforderlich sind.
- Die Anweisung
localsinitkann zum Speichern von Anweisungen weggelassen werden.
Eine weitere Reihe von Verbesserungen gilt für Szenarien, in denen Codegeneratoren Funktionalität hinzufügen:
- Modulinitialisierer sind Methoden, die die Laufzeit beim Laden einer Assembly aufruft.
- Partielle Methoden unterstützen neue zugängliche Modifizierer und Rückgabetypen des Typs „nicht-void“. In diesen Fällen muss eine Implementierung bereitgestellt werden.
C# 9 wurden viele weitere kleine Features hinzugefügt, die die Produktivität von Entwicklern verbessern, sowohl beim Schreiben als auch beim Lesen von Code:
new-Ausdrücke mit Zieltyp- Anonyme
static-Funktionen - Bedingte Ausdrücke mit Zieltyp
- Unterstützung für die Erweiterung
GetEnumerator()inforeach-Schleifen - Lambdaausdrücke können das Verwerfen von Parametern deklarieren
- Attribute können auf lokale Funktionen angewendet werden
Die C#-Version 9 ist eine Weiterentwicklung von C# als moderne, universell einsetzbare Programmiersprache. Features unterstützen weiterhin moderne Workloads und Anwendungstypen.
C# Version 10
Mit Version 10 wird die Sprache C# um die folgenden Features und Verbesserungen erweitert:
- Datensatzstrukturen
- Verbesserungen von Strukturtypen
- Handler für interpolierte Zeichenfolgen
global using-Direktiven- Dateibezogene Namespacedeklaration
- Muster für erweiterte Eigenschaften
- Verbesserungen bei Lambdaausdrücken
- Lässt interpolierte Zeichenfolgen vom Typ
constzu - Datensatztypen können
ToString()versiegeln - Verbesserte eindeutige Zuweisung
- Lässt Zuweisung und Deklaration in derselben Dekonstruktion zu
- Lässt
AsyncMethodBuilder-Attribut für Methoden zu - CallerArgumentExpression-Attribut
- Verbessertes
#line-Pragma
Zusätzliche Funktionen sind im Vorschau-Modus verfügbar. Sie werden aufgefordert, diese Features zu testen und Feedback zu ihnen zu geben . Sie können sich vor der endgültigen Veröffentlichung jedoch noch ändern. Um diese Features zu verwenden, müssen Sie in Ihrem Projekt festlegen <LangVersion>Preview :
- Generische Attribute weiter unten in diesem Artikel.
- Statische abstrakte Elemente in Schnittstellen
C# 10 arbeitet weiterhin an Designs zum Entfernen von Zeremonien, trennen Daten von Algorithmen und verbesserte Leistung für die .NET-Runtime.
Viele der Features bedeuten, dass Sie weniger Code eingeben, um dieselben Konzepte auszudrücken. Datensatz weist viele der gleichen Methoden auf, die Datensatzklassen ausführen. Struktur und anonyme Typen werden mit Ausdrücken unterstützt. Globale Verwendungsrichtlinien und Dateibereichsnamespacedeklarationen bedeuten, dass Sie Abhängigkeiten und Namespaceorganisation deutlicher ausdrücken. Lambda-Verbesserungen erleichtern das Deklarieren von Lambda-Ausdrücken, wo sie verwendet werden. Neue Eigenschaftenmuster und Dekonstruktionsverbesserungen erstellen präziseren Code.
Die neuen interpolierten Zeichenfolgenhandler und AsyncMethodBuilder das Verhalten können die Leistung verbessern. Diese Sprachfeatures wurden in der .NET-Runtime genutzt, um Leistungsverbesserungen in .NET 6 zu erzielen.
C# 10 markiert auch eine größere Umstellung auf die jährliche Kadenz für .NET-Versionen. Da nicht jedes Feature im Jahreszeitrahmen abgeschlossen werden kann, können Sie einige "Vorschau"-Features in C# 10 ausprobieren. Sowohl generische Attribute als auch statische abstrakte Elemente in Schnittstellen können verwendet werden, dies sind jedoch Vorschaufeatures und können sich vor der endgültigen Version ändern.
Dieser Artikel wurde ursprünglich auf dem NDepend-Blog veröffentlicht, mit freundlicher Genehmigung von Erik Dietrich und Patrick Smacchia.