Prozedurale und objektorientierte Programmierung
Bevor Klassen eingeführt wurden, gab es in Sprachen wie C keinen Klassenbegriff. Die Programmierweise ohne Klassen und Objekte, wie bei C, bezeichnet man als prozedurale Programmierung.
Prozedurale Programmierung: Ein Programm ist eine Folge von Anweisungen; der Fokus liegt auf der Optimierung der Ausführungsschritte.
Durch die Verfügbarkeit von Klassen lässt sich objektorientierte Programmierung umsetzen.
Objektorientierte Programmierung: Ein Programm besteht aus gekapselten Klassen. Der zentrale Gedanke: Daten sowie Funktionen zur Verarbeitung dieser Daten zu logisch zusammengehörigen Einheiten zusammenfassen. Diese Einheiten sind die Klassen (class).
Definition einer Klasse
Eine Klasse ist eine Datenstruktur mit gespeicherten Daten und ausführbarem Code. Es gibt zwei Gruppen von Mitgliedern:
- Datenmitglieder (Data Members): Speichern Objektattribute: Felder (Fields), Konstanten (Constants)
- Funktionsmitglieder (Function Members): Implementieren das Verhalten von Objekten: Methoden, Eigenschaften, Konstruktoren, Destruktoren, Operatoren, Indexer, Ereignisse
Eine Klasse ist eine Sammlung gekapselter, logisch verbundener Daten und Funktionen, um Dinge aus der realen oder abstrakten Welt abzubilden.
Kurz gesagt ist eine Klasse eine aus Daten und Funktionen aufgebaute Datenstruktur. Aus einer Klasse können Objekte erzeugt werden; über Objekte greift man auf Daten und Mitglieder zu, der Zugriff ist aber auch innerhalb der Klasse möglich.
Deklaration einer Klasse
Das Schlüsselwort class definiert lediglich eine Klassenvorlage, es erzeugt keine Objektinstanzen. Eine Vorlage besteht aus drei Teilen: Klassenname, Klassenmitglieder, Klasseneigenschaften.
Syntax
class Klassenname
{
// Mitgliedsdeklaration (Felder, Methoden, Reihenfolge ist nicht vorgeschrieben)
}Code-Sprache: JavaScript (javascript)
Die Klassendeklaration wird oft auch als Klassendefinition (class definition) bezeichnet
class Program
{
static void Main(string[] args)
{
AddCalculator addCalculator = new AddCalculator();
SubCalculator subCalculator = new SubCalculator();
}
}
class AddCalculator
{
public int A { get; set; }
public int B { get; set; }
public int Add()
{
return A + B;
}
}
class SubCalculator
{
public int A { get; set; }
public int B { get; set; }
public int Subtract()
{
return A - B;
}
}Code-Sprache: JavaScript (javascript)
In dem obigen Beispiel werden zwei Klassen deklariert: eine für Additionen, eine für Subtraktionen. Innerhalb der Main-Funktion des Hauptprogramms erstellen wir Instanzen dieser beiden Klassen zur Nutzung.
Inhalt stammt von foxdevelop.com
Klassendeklarationen müssen nicht von oben nach unten angeordnet sein. Sie können Klassen unten im Code definieren und sie in der darüberliegenden Main-Funktion aufrufen. Eine Klasse ist nur eine Vorlage bzw. ein Bauplan. Der Code läuft nicht streng von oben nach unten ab; die Ausführung beginnt bei Main, und das Programm sucht bei Bedarf die passende Klassenvorlage.

Klassenmitglieder
Felder (Fields)
Ein Feld ist eine zu einer Klasse gehörende Variable. Es kann ein eingebauter oder benutzerdefinierter Typ sein und unterstützt das Lesen und Schreiben von Daten.
Typ Feldname;
class MyClass
{
int MyField; // Feld MyField vom Typ int
}Code-Sprache: JavaScript (javascript)
Wichtiger Unterschied zu C/C++: C# kennt keine globalen Variablen. Alle Felder müssen innerhalb eines Typs (Klasse oder Struktur) deklariert werden.
Regeln zur Feldinitialisierung
(1) Implizite Initialisierung (ohne Wertzuweisung)
Der Compiler weist automatisch den Standardwert des jeweiligen Typs zu; die Standardwerte unterscheiden sich je nach Typ.
int F1; // Standardwert 0
string F2; // Standardwert nullCode-Sprache: JavaScript (javascript)
Die folgende Tabelle zeigt die Zuordnung von C#-Typen und Standardwerten für Felder. Diese Regel gilt nur für Felder; lokale Variablen müssen vom Entwickler manuell initialisiert werden.
Einfache Werttypen
| Datentyp | Standardwert | Beschreibung |
|---|---|---|
sbyte | 0 | Vorzeichenbehafteter 8-Bit-Integer |
byte | 0 | Vorzeichenloser 8-Bit-Integer |
short | 0 | Vorzeichenbehafteter 16-Bit-Integer |
ushort | 0 | Vorzeichenloser 16-Bit-Integer |
int | 0 | Vorzeichenbehafteter 32-Bit-Integer |
uint | 0 | Vorzeichenloser 32-Bit-Integer |
long | 0L | Vorzeichenbehafteter 64-Bit-Integer |
ulong | 0UL | Vorzeichenloser 64-Bit-Integer |
float | 0.0f | Einfachgenaue Gleitkommazahl |
double | 0.0d | Doppelgenaue Gleitkommazahl |
decimal | 0.0m | Hochgenaue Dezimalzahl |
char | '\0' (Nullzeichen, ASCII 0) | Einzelnes Zeichen |
bool | false | Boolescher Typ |
Enumeration Enum | Das Enumerationselement zum zugrundeliegenden Integer 0 | Enumerationen basieren auf Ganzzahlen, Standardwert 0 |
Struktur struct | Jedes Feld erhält seinen eigenen Standardwert | Benutzerdefinierter Werttyp, vollständig genullt |
Referenztypen
Alle Referenztypen besitzen einheitlich den Standardwert null. Das bedeutet, die Variable zeigt auf kein Objekt im Heap-Speicher.
Mit anderen Worten: Es ist keine gültige Speicheradresse abgelegt. Erinnern Sie sich an das vorherige Speicherdiagramm: Referenztypen speichern Heap-Adressen wie 000001 01010. Bei null ist keine gültige Adresse hinterlegt.
| Typkategorie | Beispieltypen | Standardwert |
|---|---|---|
| Eingebaute Referenztypen | string, object | null |
Benutzerdefinierte Klasse class | Person Student | null |
| Arrays (jede Dimension) | int[], string[,] | null |
| Delegaten / Ereignisse | Action, Func, benutzerdefinierter delegate | null |
Schnittstelle interface | Jede Interface-Variable | null |
Beispiele
string str; // Standard null
Student jason; // Benutzerdefinierte Klasse, Standard null
int[] arr; // Array, Standard null
Action callback; // Delegat, Standard nullCode-Sprache: JavaScript (javascript)
Nullable-Typen (Nullable / T?)
Hängt man an einen einfachen Datentyp ein Fragezeichen ?, entsteht ein neuer Typ, der auch ohne gültigen Wert existieren kann. Beispiel: int age; erhält ohne Zuweisung automatisch den Wert 0. Möchte man ausdrücken, dass gar kein Wert vorhanden ist, schreibt man int? age2;. age2 ist dann ein Nullable-Typ und kann mit null belegt werden: int? age2 = null;
Ein Nullable-Typ ist ein umhüllter ValueType mit dem Standardwert null, was „kein gültiger Wert“ bedeutet.
| Deklarationssyntax | Standardwert |
|---|---|
int? num | null |
bool? flag | null |
decimal? price | null |
class Test
{
int a; // automatisch 0
string b; // automatisch null
bool c; // automatisch false
}Code-Sprache: JavaScript (javascript)
(2) Explizite Initialisierung
Weisen Sie bei der Deklaration mit = einen Wert zu. Der zugewiesene Wert muss zur Kompilierzeit feststehen; zufällige Werte oder Benutzereingaben sind hier unzulässig.
int days = 25;
string word = "foxdevelop";Code-Sprache: JavaScript (javascript)
(3) Kurzschreibweise für mehrere Felder gleichen Typs
Mehrere Variablen gleichen Typs können durch Kommas getrennt gemeinsam deklariert werden. Verschiedene Typen dürfen nicht in einer Zeile gemischt werden
int player, blood = 25;
string title, subTitle = "hi welcome to foxdevelop.com";Code-Sprache: JavaScript (javascript)
Methoden (Methods)
Methodendefinition
Eine Methode ist ein benannter, wiederverwendbarer ausführbarer Codeblock, vergleichbar mit Memberfunktionen in C++. Bei Aufruf wird der interne Code ausgeführt, danach kehrt die Steuerung zum Aufrufer zurück. Man unterscheidet Methoden mit und ohne Rückgabewert.
Vier Bestandteile einer Methode
- Rückgabetyp: Bei fehlendem Rückgabewert wird
voidangegeben - Methodenname
- Parameterliste: Die Klammern
()sind auch ohne Parameter verpflichtend - Methodenrumpf: Ausführbarer Code eingeschlossen in
{}
class Program
{
static void Main(string[] args)
{
Robot robot = new Robot();
robot.SayHello();
}
}
class Robot
{
public void SayHello()
{
Console.WriteLine("Hello everyone");
Console.WriteLine("Welcome to visit foxdevelop.com");
}
}Code-Sprache: JavaScript (javascript)
Das Schlüsselwort public vor public void SayHello() ist ein Zugriffsmodifikator: Damit kann die Funktion von außerhalb der Klasse über Objektname.MethodeName aufgerufen werden. Fehlt public, gilt standardmäßig private. Private Methoden sind nur innerhalb der Klasse aufrufbar; von außen – auch über eine Instanz wie robot – nicht erreichbar.

Erstellen von Klassenvariablen und Instanzen
1. Grundeigenschaften von Referenztypen
Klassen zählen zu den Referenztypen. Der Speicher gliedert sich in zwei Bereiche:
- Stack: Speichert Referenzvariablen (Zeiger auf Speicheradressen)
- Heap: Speichert die eigentlichen Objektdaten
2. Schrittweise Erstellung eines Objekts
1 Nur Deklaration der Referenzvariable (nur Stack belegt, kein Objekt im Heap)
Robot robot;
// Nur Speicherplatz für die Referenz im Stack reserviert, Wert undefiniert, kein Objekt im Heap
Code-Sprache: JavaScript (javascript)

2 Speicherzuweisung im Heap mit dem Operator new
new Typname();Code-Sprache: JavaScript (javascript)
- Reserviert Speicher im Heap und initialisiert alle Felder automatisch mit Standardwerten
- Gibt die Referenzadresse des Heap-Objekts zurück und weist sie der Stack-Variablen zu
robot = new Robot();
Code-Sprache: JavaScript (javascript)

class Program
{
static void Main(string[] args)
{
Robot robot;
robot = new Robot();
}
}
class Robot
{
void SayHello()
{
Console.WriteLine("Hello everyone");
Console.WriteLine("Welcome to visit foxdevelop.com");
}
}Code-Sprache: JavaScript (javascript)
3. Deklaration und Instanziierung in einer Zeile
Robot robot = new Robot();Code-Sprache: JavaScript (javascript)
class Program
{
static void Main(string[] args)
{
Robot robot = new Robot();
}
}Code-Sprache: JavaScript (javascript)
Klassendefinition