Grundlagen und Syntax
Instanzmethode vs. Statische Methode
Instanzmethode:
Gehören zu einem konkreten Objekt (Instanz) und verändern nur den Zustand dieses Objekts.
Hat Zugriff auf die Instanzvariablen, da es this verwenden kann.
Statische Methode:
Sind in einer Klasse definiert, aber nicht an eine Instanz gebunden. Werden über den Klassennamen aufgerufen Klasse.Methode().
Wo beginnt ein C# Programm
Antwort:
Jedes C#-Programm beginnt standardmäßig in der Main-Methode. Das ist der Einstiegspunkt (Entry Point).
class Program {
static void Main(string[] args) {
// Hier startet das Programm
}
}Hinweis: Seit C# 9 gibt es auch “Top-Level Statements”, bei denen man die Main-Methode weglassen kann, aber im Hintergrund wird sie trotzdem generiert.
Grundaufbau eines Programm
Namespaces
Namespaces sind logische Gruppen von Klassen. Sie helfen, die Klassenstruktur zu organisieren und Konflikte zu vermeiden. Dadurch können zwei Bibliotheken mit demselben Klassennamen ohne Konflikte funktionieren.
namespace MyNamespace {
public class MyClass {
// ...
}
}An einem anderen Standort kann man auf die Klassen in einem Namespace zugreifen
using MyNamespace;
var myClass = new MyClass();
// Ohne using
var myClass = new MyNamespace.MyClass();Using
using ist ein Schlüsselwort, das verwendet wird, um einen Namespace zu importieren.
Dadurch kann man auf die Klassen in einem Namespace zugreifen, ohne den Namespace explizit zu benennen.
using System;
Console.WriteLine("Hello, World!");
// Ohne using
System.Console.WriteLine("Hello, World!");using kann auch als Ressource verwendet werden, um eine Datei zu öffnen und zu schließen.
using var file = new FileStream("example.txt", FileMode.Open);
// Datei wird gelesen und am Ende automatisch geschlossen
using (var file = new FileStream("example.txt", FileMode.Open)) {
// ...
}Klassen
Klassen sind Baupläne für Objekte. Sie definieren die Eigenschaften und Verhalten von Objekten.
namespace MyApp;
public class MyClass {
// Felder
private int _age;
// Properties
public int MyProperty { get; set; }
public string Name { get;}
public int Age => _age;
// Konstruktor
public MyClass(int age) {
_age = age;
}
// Methoden
public void MyMethod(int age) {
_age++;
}
// Finalizer
~MyClass() {
// ...
}
// Destructor
public void Dispose() {
}Charakteristiken einer statischen Klasse
Statische Klassen lassen sich nicht instanzieren (kein new möglich) und sind automatisch sealed (nicht vererbbar).
Nur statische Member (Felder, Eigenschaften, Methoden) können in einer statischen Klasse definiert werden.
Man verwendet sie für Hilfsklassen wie System.Math.
public static class Rechner {
public static double Pi = 3.14159;
public static double Quadrat(double x) {
return x * x;
}
}
// Fehler:
var rechner = new Rechner();
double quadrat = Rechner.Quadrat(2);
double pi = Rechner.Pi;Wie vereinbart man eine Variable, und was ist der Unterschied zu einem Field?
Variablen werden mit einem Datentyp, Namen und Wert deklariert. var kann verwendet werden, um den Datentyp automatisch zu ermitteln.
Ein Field ist eine Variable innerhalb einer Klasse, das einen Wert enthält.
namespace MyApp;
public class MyClass {
private int _age; // Field
public void SetAge(int age) {
int localAge = age; // Variable
_age = localAge;
}
}
Statische und dynamische Methoden
Statische Methoden:
Gehören zu einer Klasse und können über Klasse.Methode() aufgerufen werden. Sie haben keinen Zugriff auf this.
Dynamische Methoden:
Gehören zu einem Objekt und kann über object.Methode() aufgerufen werden. Sie haben Zugriff aufdie Daten der konkreten Instanz.
Kommentare
Kommentare helfen dabei zu erklären, warum der Code das macht und nicht was er macht.
Einzele Kommentare:
// Einzeiler KommentarMehrzeiler Kommentar:
/*
Mehrzeiler Kommentar
*/XML Kommentare:
XML Kommentare werden oft verwendet um Dokumentation zu erstellen.
/// <summary>
/// Dies ist ein XML Kommentar
/// </summary>
/// <param name="name">Der Name des Kommentars</param>
/// <returns>Der Rückgabewert des Kommentars</returns>Wann sind Kommentare sinnvoll?
Kommentare sind sinnvoll, wenn man folgende Dinge beschreiben will:
- Lizenzen / Rechtlichte Hinweise: Aus rechtlichen Gründen können bestimmte Kommentare erforderlich sein.
- Erklärung von Entscheidungen: Kommentare können dabei erklären, warum eine bestimmte Entscheidung getroffen wurde.
- Warnungen vor schwer erkennbaren Konsequenzen: Kommentare können dabei warnen, was passiert wenn eine bestimmte Aktion ausgeführt wird.
- TODOs: Kommentare können dabei markieren, was noch zu tun ist.
Dreifachoperator: Wann verwendet man den und wofür ist der sinnvoll?
Dreifachoperatoren werden verwendet um kurz eine Bedingung zu prüfen und einen Wert zurückzugeben. Sie ersetzen einen kurzen if-else Block mit einer Expression.
var role = isAdmin ? "Admin" : "User";
Was sind gute Variablenamen?
Variablennamen sollten klar, präzise und erklären was sie beinhalten.
Sie sollten beschreibend sein und nicht abkürzend besonderFunktion anstatt bf.
Lokale Variablen nutzen camelCase, während Klassenmember PascalCase verwenden.
Konvertierungsregeln
- Wenn nichts verloren geht, kann es implizit erfolgen.
- Sonst Casten explizit
TryParse kennen
TryParse wird verwendet um Text sicher in einen Datentyp zu konvertieren.
Der Rückgabewert ist ein Bool Wert, der angibt ob die Konvertierung erfolgreich war.
Der Ausgabeparameter ist der konvertierte Wert.
if(int.TryParse(text, out int number)) {
Console.WriteLine(number);
} else {
Console.WriteLine("Invalid input");
}Neben int.TryParse gibt es auch double.TryParse, float.TryParse, bool.TryParse und DateTime.TryParse.
out wird verwendet um einen Wert aus einer Methode zurückzugeben.
TryParse gibt hier nur ein true/false zurück, der Wert wird über den out Parameter zurückgegeben.
Wenn das Ergebnis true ist, wird der Wert in der Variable gespeichert.
Nullable Types
Nullable Types sind Typen, die zusätzlich zu ihrem eigenen Wert auch den Wert null enthalten können.
Von int kann man beispielsweise int? machen, um auch den Wert null zu erlauben.
Aber von int? kann man nicht int machen, sondern nur mit einem expliziten Cast.
int? number = null;
int number2 = (int)number;TryCatch
try {
// Code der geprüft werden soll
} catch (Exception e) {
// Code der ausgeführt wird, wenn ein Fehler auftritt
} finally {
// Code der ausgeführt wird, unabhängig von ob ein Fehler auftritt oder nicht
}Exception ist die Basisklasse für alle Fehler.
Andere Exceptions:
ArgumentNullException- Wenn ein Argument null istArgumentOutOfRangeException- Wenn ein Argument außerhalb des gültigen Bereichs istInvalidOperationException- Wenn eine Operation ungültig istIOException- Wenn ein Eingabe/Ausgabe Fehler auftrittFormatException- Wenn ein Format Fehler auftrittOverflowException- Wenn ein Überlauf auftrittStackOverflowException- Wenn ein Stack Überlauf auftritt
Fehlertypen
Logische Fehler
Der Code ist kompilierbar, aber führt zu einem Fehler bei der Ausführung.
Das kann von falschen Berechnungen bis zu falschen Bedingungen (if(age > 18) statt if(age >= 18)) führen.
Laufzeitfehler
Der Fehler beendet das Programm. Diese können ausgelöst werden durch falsche Eingaben, fehlende Dateien, es wird durch 0 geteilt, etc.
Syntaktische Fehler
Der Code lässt sich nicht kompilieren, da er gegen die Grammatik von C# verstößt.
Mögliche Fehler:
- Fehlende Klammern (
if (x > 0 { ... }) - Fehlende Semikolons (
int x = 3) - Falsches Schlüsselwort (
pubik class ...)