TASIOMIND.DEV — OPERATIONAL▸▸▸FULL STACK DEVELOPER @ GWQ SERVICEPLUS AG▸▸▸FOUNDER — K8SGPT.AI▸▸▸OPEN SOURCE: ACTIVE▸▸▸DISTRIBUTED SYSTEMS / KUBERNETES / AI▸▸▸RUST + GO + PYTHON▸▸▸FIELD TESTED / STATUS — NOMINAL▸▸▸LOCATION: EUROPE/BERLIN▸▸▸TASIOMIND.DEV — OPERATIONAL▸▸▸FULL STACK DEVELOPER @ GWQ SERVICEPLUS AG▸▸▸FOUNDER — K8SGPT.AI▸▸▸OPEN SOURCE: ACTIVE▸▸▸DISTRIBUTED SYSTEMS / KUBERNETES / AI▸▸▸RUST + GO + PYTHON▸▸▸FIELD TESTED / STATUS — NOMINAL▸▸▸LOCATION: EUROPE/BERLIN▸▸▸

C# für JavaScript-Entwickler: Ein Einstieg

May 18, 2020

Dieser Leitfaden richtet sich an Entwickler mit einem Hintergrund in JavaScript oder TypeScript und bietet eine kompakte Einführung in die grundlegenden Konzepte von C# und dem .NET-Ökosystem.


1. Projektstruktur und das dotnet-CLI

Ein typisches .NET-Projekt wird mit dem dotnet-Kommandozeilen-Tool verwaltet.

Projektstruktur

code
.
└── src/
    └── MeinProjekt/
        ├── MeinProjekt.csproj
        └── Program.cs
  • *.csproj: Die Projektdatei (im XML-Format), die Abhängigkeiten (NuGet-Pakete), die Ziel-Framework-Version und andere Build-Einstellungen beschreibt.
  • Program.cs: Die C#-Quelldatei, die den Einstiegspunkt des Programms (Main-Methode) enthält.
  • bin/, obj/: Verzeichnisse, die vom Build-Prozess erstellt werden und die kompilierten Artefakte (.dll-Dateien) enthalten. Sie sollten in .gitignore eingetragen werden.

Wichtige dotnet-Befehle

code
# Führt das Projekt aus
dotnet run

# Fügt ein NuGet-Paket (vergleichbar mit einem npm-Paket) hinzu
dotnet add package Newtonsoft.Json

# Stellt alle im .csproj definierten Abhängigkeiten wieder her
dotnet restore

# Kompiliert das Projekt, ohne es auszuführen
dotnet build

2. Grundlegende C#-Syntax im Vergleich

C# ist eine statisch typisierte Sprache mit einer Syntax, die einige Ähnlichkeiten zu JavaScript/TypeScript aufweist.

  • Starke Typisierung: Wie in TypeScript muss jede Variable einen Typ haben.
  • Semikolons: Jede Anweisung muss mit einem Semikolon (;) enden.
  • using: Entspricht import in JavaScript/TypeScript und importiert Namensräume.
  • void: Gibt an, dass eine Methode keinen Wert zurückgibt.

Beispiel:

code
// Importiert den System-Namensraum für den Zugriff auf die Console-Klasse
using System;

// Program.cs
// 'args' ist ein Array von Strings, das Kommandozeilen-Argumente enthält
if (args.Length > 0)
{
  // String-Interpolation funktioniert ähnlich wie bei Template Literals in JS
  Console.WriteLine($"Hallo, {args[0]}!");
}
else
{
  Console.WriteLine("Hallo, Unbekannter!");
}

3. Typen und Datenstrukturen

Variablen

code
// Explizite Typisierung
int x = 34;
string name = "John";

// Implizite Typisierung mit 'var'
// Der Compiler leitet den Typ ab (hier: int), die Variable bleibt aber stark typisiert.
var y = 34;

Arrays

Arrays in C# haben eine feste Größe.

code
// Erstellt ein Array für 3 double-Werte
double[] grades = new double[3];
grades[0] = 90.5;

Listen (List<T>)

Listen sind flexibler als Arrays und ihre Größe kann sich dynamisch ändern. Sie sind vergleichbar mit JavaScript-Arrays.

code
// Import erforderlich: using System.Collections.Generic;
var grades = new List<double> { 13.2, 29.1, 33.1 };

// Fügt ein neues Element hinzu
grades.Add(52.1);

4. Klassen und Objekte (OOP-Grundlagen)

  • Klasse: Ein Bauplan (class) für Objekte.
  • Objekt: Eine Instanz einer Klasse.
  • Felder (Fields): Private Variablen, die den internen Zustand eines Objekts speichern.
  • Eigenschaften (Properties): Öffentliche Schnittstellen zum Lesen oder Schreiben von Zustandsdaten (oft mit get; und set;).
  • Methoden: Funktionen, die das Verhalten eines Objekts definieren.

Beispiel:

code
public class Book
{
  // Privates Feld zur Speicherung der Noten
  private List<double> _grades;

  // Öffentliche Eigenschaft (nur lesbar von außen)
  public string Name { get; }

  // Konstruktor: wird aufgerufen, wenn ein neues Objekt erstellt wird
  public Book(string name)
  {
    Name = name;
    _grades = new List<double>();
  }

  // Öffentliche Methode
  public void AddGrade(double grade)
  {
    _grades.Add(grade);
  }
}

Verwendung:

code
var myBook = new Book("C# für Einsteiger");
myBook.AddGrade(95.5);

Access Modifiers

  • public: Von überall aus sichtbar.
  • private: Nur innerhalb der eigenen Klasse sichtbar.
  • protected: Sichtbar innerhalb der eigenen Klasse und in abgeleiteten Klassen.

static-Member

Ein static-Member gehört zur Klasse selbst, nicht zu einer Instanz des Objekts. Er wird aufgerufen, ohne ein Objekt zu erstellen.

code
public class Utils
{
  public static void Log(string message)
  {
    Console.WriteLine(message);
  }
}

// Aufruf:
Utils.Log("Dies ist eine statische Methode.");

5. Debugging in VS Code

Die C#-Erweiterung für Visual Studio Code bietet eine hervorragende Debugging-Unterstützung.

  • F5: Startet eine Debugging-Sitzung.
  • Ctrl+F5: Führt das Programm ohne Debugger aus.
  • Shift+F5: Stoppt die Debugging-Sitzung.