Freigeben über


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 12

Veröffentlicht im November 2023

Die folgenden Features wurden in C# 12 hinzugefügt:

  • Primäre Konstruktoren – Sie können primäre Konstruktoren in jedem Typ class oder struct erstellen.
  • Sammlungsausdrücke – Neue Syntax zum Angeben von Sammlungsausdrücken, einschließlich des Spread-Operators (..e), um eine beliebige Sammlung zu erweitern.
  • Inlinearrays – Inlinearrays ermöglichen es Ihnen, ein Array mit fester Größe in einem struct-Typ zu erstellen.
  • Optionale Parameter in Lambdaausdrücken – Sie können Standardwerte für Parameter für Lambdaausdrücke definieren.
  • ref readonlyParameter - ref readonly Parameter ermöglichen mehr Klarheit für APIs, die ref-Parameter oder in-Parameter verwenden können.
  • Alias eines beliebigen Typs – Sie können die Aliasanweisung using verwenden, um Aliasse für einen beliebigen Typ und nicht nur für benannte Typen zu vergeben.
  • Experimentattribute – Geben Sie ein experimentelles Feature an.

Interceptors – als Previewfunktionveröffentlicht.

Insgesamt bietet C# 12 neue Features, mit denen Sie C#-Code produktiver schreiben können. Die Syntax, die Sie bereits kennen, ist an zusätzlichen Stellen verfügbar. Andere Syntax ermöglicht Konsistenz für verwandte Konzepte.

C#-Version 11

Veröffentlicht im November 2022

Die folgenden Features wurden C# 11 hinzugefügt:

In C# 11 wurden generische Mathematik und mehrere Features eingeführt, die dieses Ziel unterstützen. Sie können für alle Zahlentypen numerische Algorithmen einmal schreiben. Es gibt noch weitere Features, die das Arbeiten mit struct-Typen erleichtern, wie z. B. erforderliche Member und automatische Standardstrukturen. Das Arbeiten mit Zeichenfolgen wird durch unformatierte Zeichenfolgenliterale, Zeilenvorschub in Zeichenfolgeninterpolationen und UTF-8-Zeichenfolgenliterale einfacher. Features wie dateilokale Typen ermöglichen es, Quell-Generatoren einfacher zu gestalten. Schließlich fügen Listenmuster weitere Unterstützung für den Musterabgleich hinzu.

C#-Version 10

Veröffentlicht im November 2021

Mit Version 10 wird die Sprache C# um die folgenden Features und Verbesserungen erweitert:

Weitere Features waren im Vorschaumodus verfügbar. Um diese Features nutzen zu können, müssen Sie in Ihrem Projekt <LangVersion> auf Preview festlegen:

In C# 10 wird die Arbeit an Designs zur Beseitigung von Aufwand, zur Trennung von Daten und Algorithmen und zur Verbesserung der Leistung der .NET Runtime fortgesetzt.

Durch viele der Features müssen Sie weniger Code eingeben, um die gleichen Konzepte auszudrücken. Datensatzstrukturen synthetisieren viele der gleichen Methoden wie Datensatzklassen. Strukturen und anonyme Typen unterstützen „with“-Ausdrücke. Globale „using“-Anweisungen und dateibezogene Namespacedeklarationen bedeuten, dass Sie Abhängigkeiten und Namespaceorganisation deutlicher ausdrücken. Verbesserungen in Lambda machen es einfacher, Lambdaausdrücke dort zu deklarieren, wo sie verwendet werden. Neue Eigenschaftenmuster und Dekonstruktionsverbesserungen sorgen für präziseren Code.

Die neuen interpolierten Zeichenfolgenhandler und das neue AsyncMethodBuilder-Verhalten können die Leistung verbessern. Diese Sprachfeatures wurden in der .NET-Runtime umgesetzt, um Leistungsverbesserungen in .NET 6 zu erzielen.

C# 10 markiert auch eine Umstellung auf den jährlichen Rhythmus für .NET-Releases. Da nicht jedes Feature innerhalb eines Jahres fertiggestellt werden kann, können Sie einige „Vorschaufeatures“ in C# 10 ausprobieren. Sowohl generische Attribute als auch statische abstrakte Member in Schnittstellen können verwendet werden, aber diese Previewfunktionen können sich vor dem endgültigen Release ändern.

C#-Version 9

Veröffentlicht im November 2020

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:

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:

C# 9 enthält neue Verbesserungen am Musterabgleich:

  • Typmuster gleichen Objekte ab, die einem bestimmten Typ entsprechen.
  • In Klammern gesetzte Muster erzwingen den Vorrang von Musterkombinationen oder heben diesen hervor.
  • In konjunktiven and-Mustern müssen beide Muster übereinstimmen.
  • In disjunktiven or-Mustern muss eines von beiden Mustern übereinstimmen.
  • In negierten not-Mustern darf ein Muster nicht übereinstimmen.
  • In relationalen Mustern muss die Eingabe kleiner als, größer als, kleiner gleich oder größer gleich einer angegebenen Konstante sein

Diese Muster erweitern die Mustersyntax. Sehen Sie sich die folgenden Beispiele an:

public static bool IsLetter(this char c) =>
    c is >= 'a' and <= 'z' or >= 'A' and <= 'Z';

Mit optionalen Klammern, die verdeutlichen, dass and Vorrang vor or hat:

public static bool IsLetterOrSeparator(this char c) =>
    c is (>= 'a' and <= 'z') or (>= 'A' and <= 'Z') or '.' or ',';

Einer der gängigsten Anwendungsfälle ist eine neue Syntax für NULL-Überprüfungen:

if (e is not null)
{
    // ...
}

Jedes dieser Muster kann in jedem Kontext verwendet werden, in dem Muster zulässig sind: is-Musterausdrücke, switch-Ausdrücke, geschachtelte Muster und das Muster einer case-Bezeichnung einer switch-Anweisung.

Eine weitere Reihe von Features unterstützt High Performance Computing in C#:

  • Die Typen nint und nuint modellieren 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 localsinit kann zum Speichern von Anweisungen weggelassen werden.

Leistung und Interop

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.

Anpassen und Fertigstellen von Features

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() in foreach-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 8.0

Veröffentlicht im September 2019

C# 8.0 ist das erste Hauptrelease von C#, das speziell auf .NET Core ausgerichtet ist. Einige Features nutzen neue CLR-Funktionen (Common Language Runtime), 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:

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 7.3

Veröffentlicht im Mai 2018

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 ref erneut 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 sich um in unterscheiden, 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 7.2

Veröffentlicht im November 2017

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 als in-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 protectedZugriffsmodifizierer:
    • Der private protected-Zugriffsmodifizierer ermöglicht den Zugriff für abgeleitete Klassen innerhalb der gleichen Assembly.
  • Bedingte ref-Ausdrücke:
    • Das Ergebnis eines bedingten Ausdrucks (?:) kann jetzt ein Verweis sein.

C#-Version 7.1

Veröffentlicht im August 2017

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:

  • Die asyncMain-Methode
    • Der Einstiegspunkt für eine Anwendung kann über den Modifizierer async verfügen.
  • 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.

Der Compiler verfügt nun über die zwei Optionen -refout und -refonly, mit denen die Generierung der Referenzassembly gesteuert wird.

C# Version 7.0

Veröffentlicht im März 2017

Die C#-Version 7.0 wurde mit Visual Studio 2017 veröffentlicht. Diese Version bietet einige evolutionäre und hilfreiche Aspekte im Stil von C# 6.0. Hier sind einige der neuen Features:

Weitere Features umfassten:

Alle diese Features bieten neue Möglichkeiten für Entwickler und erlauben es, 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. .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 6.0

Veröffentlicht im Juli 2015

Die mit Visual Studio 2015 veröffentlichte Version 6.0 brachte viele kleinere Features, die die C#-Programmierung produktiver machten. Hier sind einige davon:

Zu weiteren neuen Features gehören:

  • Indexinitialisierer
  • „Await“ in Catch- und Finally-Blöcken
  • Standardwerte für Getter-exklusive Eigenschaften

Wenn Sie die Features zusammen betrachten, erkennen Sie ein interessantes Muster. In dieser Version von C# wurden Sprachbausteine 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 5.0

Veröffentlicht im August 2012

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:

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.

C# Version 4.0

Veröffentlicht im April 2010

Die C#-Version 4.0, veröffentlicht mit Visual Studio 2010, führte einige interessante neue Features ein:

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 3.0

Veröffentlicht im November 2007

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:

Rückblickend scheinen viele dieser Features unvermeidlich und untrennbar. Sie alle passen strategisch zusammen. Das durchschlagende Feature dieser C#-Version war 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 schuf die Grundlagen, 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. Durch die Kombination von Abfrageausdrücken und Erweiterungsmethoden sah eine Liste ganzer Zahlen nützlicher aus.

C# Version 2.0

Veröffentlicht im November 2005

Werfen wir einen Blick auf einige wichtige Features von C# 2.0, die im Jahr 2005 zusammen mit Visual Studio 2005 veröffentlicht wurden:

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

Während C# als allgemein gehaltene, objektorientierte (OO) Sprache gestartet ist, änderte sich dies mit der C#-Version 2.0 schnell. 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 Generics ist besser als das Erstellen eines ListInt-Typs, der für jeden Vorgang von ArrayList abgeleitet oder aus Object umgewandelt 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.

C# Version 1.2

Veröffentlicht im April 2003

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 1.0

Veröffentlicht im Januar 2002

Die mit Visual Studio .NET 2002 veröffentlichte C#-Version 1.0 ähnelte Java sehr stark. Zu den erklärten Entwurfszielen für ECMA gehörte es, eine „einfache, moderne, objektorientierte Allzwecksprache“ zu sein. Damals bedeutete das Aussehen wie Java, dass diese frühen Entwurfsziele erreicht wurden.

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:

Dieser Artikel wurde ursprünglich auf dem NDepend-Blog veröffentlicht und uns freundlicherweise von Erik Dietrich und Patrick Smacchia zur Verfügung gestellt.