Freigeben über


Roadmap für Java-Entwickler, die C# lernen

Wenn Sie einen neuen Job beginnen oder einem Team beitreten, das C# verwendet, hilft Ihnen dieser Artikel, schnell produktiv zu werden. Es hebt hervor, was aus Java vertraut ist und was in C# neu ist.

C# und Java haben viele Ähnlichkeiten. Wenn Sie sich mit C# vertraut machen, können Sie einen Großteil der Kenntnisse anwenden, die Sie sich bereits im Zusammenhang mit dem Programmieren in Java angeeignet haben:

  1. Ähnliche Syntax: Sowohl Java als auch C# gehören zur C-Sprachfamilie. Diese Ähnlichkeit bedeutet, dass Sie C# bereits lesen und verstehen können. Es gibt einige Unterschiede, aber ein Großteil der Syntax ist identisch mit Java und C. Die geschweiften Klammern und Semikolons sind Ihnen bereits bekannt. Steuerelementanweisungen wie if, else und switch sind identisch. Die Schleifenanweisungen for, while, und do...while sind identisch. In beiden Sprachen sind dieselben Schlüsselwörter für class und interface verfügbar. Die Zugriffsmodifizierer von public zu private sind identisch. Selbst viele der integrierten Typen verwenden dieselben Schlüsselwörter: int, , stringund double.
  2. Objektorientiertes Paradigma: Sowohl Java als auch C# sind objektorientierte Sprachen. Die Konzepte von Polymorphie, Abstraktion und Kapselung finden in beiden Sprachen Anwendung. Bei beiden wurden neue Konstrukte hinzugefügt, aber die wichtigsten Features sind weiterhin relevant.
  3. Stark typisiert: Sowohl Java als auch C# sind stark typisierte Sprachen. Sie deklarieren den Datentyp von Variablen (entweder explizit oder implizit). Der Compiler erzwingt die Typsicherheit. Er ermittelt typbezogene Fehler in Ihrem Code, bevor Sie den Code ausführen.
  4. Plattformübergreifend: Sowohl Java als auch C# sind plattformübergreifende Sprachen. Sie können Ihre Entwicklungstools auf Ihrer bevorzugten Plattform ausführen. Ihre Anwendung kann auf mehreren Plattformen ausgeführt werden. Ihre Entwicklungsplattform muss nicht mit der Zielplattform übereinstimmen.
  5. Ausnahmebehandlung: Sowohl Java als auch C# lösen Ausnahmen aus, um Fehler anzuzeigen. Beide verwenden try - catch - finally-Blöcke zum Behandeln von Ausnahmen. Die Exception-Klassen weisen ähnliche Namen und Vererbungshierarchien auf. Ein Unterschied besteht darin, dass das Konzept der überprüften Ausnahmen in C# keine Anwendung findet. Jede Methode kann (theoretisch) eine Ausnahme auslösen.
  6. Standardbibliotheken: Die .NET-Runtime und die Java Standard Library (JSL) unterstützen allgemeine Aufgaben. Beide verfügen über umfangreiche Ökosysteme für andere Open-Source-Pakete. In C# ist NuGet der Paket-Manager. Dies ist analog zu Maven.
  7. Automatische Speicherbereinigung: Beide Sprachen ermöglichen die automatische Speicherverwaltung über die automatische Speicherbereinigung (Garbage Collection, GC). Die Runtime fordert den Speicher von Objekten zurück, auf die nicht verwiesen wird. Ein Unterschied besteht darin, dass C# es Ihnen ermöglicht, Werttypen als struct-Typen zu erstellen.

Syntax auf einen Blick

Die folgenden Beispiele zeigen einige gängige Muster nebeneinander. Diese Vergleiche sind nicht vollständig, aber sie geben Ihnen ein schnelles Gefühl für die Syntaxunterschiede.

Variablendeklaration und Typinferenz:

// Java
var name = "Hello";
final int count = 5;
// C#
var name = "Hello";
const int count = 5;

Zeichenfolgeninterpolation:

// Java
var message = "Hello, " + name + "! Count: " + count;
// C#
var message = $"Hello, {name}! Count: {count}";

Weitere Informationen: Zeichenfolgeninterpolation

Lambda-Ausdrücke:

// Java
list.stream().filter(x -> x > 5).collect(Collectors.toList());
// C#
var result = list.Where(x => x > 5).ToList();

Weitere Informationen: LINQ-Übersicht

Nullbehandlung:

// Java
String value = optional.orElse("default");
// C#
string value = input ?? "default";

Weitere Informationen: Nullable Referenztypen

Was ist vertraut?

Sie können in C# fast sofort aufgrund der Ähnlichkeiten produktiv arbeiten. Lernen Sie während des Fortschritts Features und Idiome in C# kennen, die in Java nicht verfügbar sind:

  1. Musterabgleich: Der Musterabgleich ermöglicht präzise bedingte Anweisungen und Ausdrücke basierend auf der Form komplexer Datenstrukturen. Mit der is-Anweisung wird überprüft, ob eine Variable einem Muster entspricht. Der musterbasierte switch-Ausdruck bietet eine umfangreiche Syntax, um eine Variable zu prüfen und Entscheidungen basierend auf ihren Merkmalen zu treffen.
  2. Zeichenfolgeninterpolation und Rohzeichenfolgenliterale: Mit der Zeichenfolgeninterpolation können Sie ausgewertete Ausdrücke in eine Zeichenfolge einfügen, anstatt Positionsbezeichner zu verwenden. Roh-String-Literale bieten eine Möglichkeit, Escape-Sequenzen im Text zu minimieren.
  3. Nullable- und Non-Nullable-Typen: C# unterstützt Nullable-Werttypen und Nullable-Verweistypen, indem das ?-Suffix an einen Typ angefügt wird. Bei Nullable-Typen warnt Sie der Compiler, wenn Sie den Nullable-Typ nicht auf null überprüfen, bevor Sie den Ausdruck dereferenzieren. Bei Non-Nullable-Typen werden Sie vom Compiler gewarnt, wenn Sie dieser Variablen möglicherweise einen null-Wert zuweisen. Nicht-nullbare Verweistypen minimieren Programmierfehler, die einen System.NullReferenceException-Fehler verursachen.
  4. Erweiterungen: In C# können Sie Member erstellen, die eine Klasse oder Schnittstelle erweitern . Erweiterungen bieten ein neues Verhalten für einen Typ aus einer Bibliothek oder für alle Typen, die eine bestimmte Schnittstelle implementieren.
  5. LINQ: Language Integrated Query (LINQ) bietet eine allgemeine Syntax zum Abfragen und Transformieren von Daten (unabhängig vom Speicher).
  6. Lokale Funktionen: In C# können Sie Funktionen innerhalb von Methoden oder anderen lokalen Funktionen schachteln. Lokale Funktionen bieten noch eine weitere Kapselungsebene.

Tipp

Weitere Informationen zum Typsystem von C#, einschließlich struct vs. classDatensätzen und Schnittstellen, finden Sie in der Übersicht über das Typsystem im Abschnitt "Grundlagen".

In C# gibt es weitere Features, die in Java nicht verfügbar sind. Funktionen wie async und await modellieren asynchrone Operationen in sequenzieller Syntax. Die using Anweisung gibt automatisch nicht speicherbezogene Ressourcen frei.

Bei C# und Java gibt es einige ähnliche Features, die sich zwar nur leicht, aber dafür in wichtigen Punkten unterscheiden:

  1. Eigenschaften und Indexer: Eigenschaften und Indexer (Behandeln einer Klasse als Array oder Wörterbuch) bieten Sprachunterstützung. In Java handelt es sich dabei um Namenskonventionen für Methoden, die mit get und set beginnen.
  2. Datensätze: In C# können Datensätze entweder class-Typen (Verweis) oder struct-Typen (Wert) sein. C#-Datensätze können unveränderlich sein, müssen jedoch nicht unveränderlich sein.
  3. Tupel weisen in C# und Java eine unterschiedliche Syntax auf.
  4. Attribute ähneln Java-Anmerkungen.

Schließlich gibt es Java-Sprachfeatures, die in C# nicht verfügbar sind:

  1. Überprüfte Ausnahmen: In C# kann jede Methode theoretisch jede Ausnahme auslösen.
  2. Überprüfte Arraykovarianz: In C# sind Arrays nicht sicher kovariant. Sie sollten die generischen Sammlungsklassen und Schnittstellen verwenden, wenn Sie kovariante Strukturen benötigen.

Insgesamt sollten sich erfahrene Java-Entwickler schnell mit C# zurechtfinden. C# hat genug vertraute Idiome, damit Sie produktiv sein können, wenn Sie die neuen Idiome lernen.

Nächste Schritte