Eine Klassendeklaration entspricht einer Vorlage beziehungsweise einem Bauplan. Daraus können beliebig viele Klasseninstanzen erstellt werden.
Instanzmember: Jede Instanz einer Klasse ist ein eigenständiges Objekt mit eigenen Datenelementen, die unabhängig von anderen Instanzen derselben Klasse sind. Man spricht von Instanzmembern, weil sie an einzelne Klassenobjekte gebunden sind.
Statische Member: Instanzmember sind der Standardtyp. Sie können zudem statische Member definieren. Diese gehören zur Klasse selbst und nicht zu einzelnen Instanzen. Darauf gehen wir in späteren Lektionen ein.
Sehen wir uns ein Beispiel an
class Program
{
static void Main(string[] args)
{
Factory factoryFox = new Factory();
Robot robot1 = new Robot();
Robot robot2 = new Robot();
Robot robot3 = new Robot();
}
}
class Factory
{
}
class Robot
{
public string name;
public void SayHello()
{
Console.WriteLine($"Hello everyone my name is {name},I come from Foxdevelop.com");
}
}Code-Sprache: C# (cs)
In diesem Beispiel existieren zwei Klassen: Factory und Robot. Die Klasse Robot enthält eine Methode sowie das Feld name. Factory verfügt über kein name-Feld.
In der Hauptfunktion wird eine Factory-Instanz und drei Robot-Instanzen erzeugt.
Betrachten wir die Speicherstruktur im Arbeitsspeicher.

Die drei Roboter robot1, robot2 und robot3 besitzen jeweils einen eigenen name, der an unterschiedlichen Speicheradressen abgelegt ist und sich gegenseitig nicht beeinflusst. Eine Änderung an robot1 wirkt sich nicht auf robot2 aus.
static void Main(string[] args)
{
Factory factoryFox = new Factory();
Robot robot1 = new Robot();
Robot robot2 = new Robot();
Robot robot3 = new Robot();
robot1.name = "Tom"; //Jeder name ist unabhängig voneinander
robot2.name = "Jack";
robot3.name = "Smith";
}Code-Sprache: C# (cs)
Funktionsmember existieren nur einmal
Wie bei dem Feld name ersichtlich ist, verwaltet jede Instanz einen separaten Wert. Eine Änderung bei einer Instanz verändert keine anderen Instanzen. Neben Feldern besitzen Klassen auch Funktionsmember.
Gibt es von jeder Funktion innerhalb einer Klasse nur eine einzige Kopie, die alle Instanzen gemeinsam nutzen?
Der eigentliche Code einer Funktion (Methode): existiert global genau einmal und wird von allen Instanzen gemeinsam verwendet
Nach der Kompilierung liegen die Maschinenbefehle der Methoden in der Methodentabelle (Method Table) und gehören zum Typ selbst. Alle Instanzen dieser Klasse auf dem Heap nutzen diesen einen Code, jedes Objekt erhält keine eigene Kopie der Funktion.
Als Beispiel dient die Methode SayHello in der Klasse Robot
class Robot
{
public string name;
public void SayHello()
{
Console.WriteLine($"Hello everyone my name is {name},I come from Foxdevelop.com");
}
}Code-Sprache: C# (cs)
Der Arbeitsspeicher verfügt neben Heap und Stack über weitere Bereiche. Methoden werden beispielsweise in der Method Table abgelegt.
Klassenfunktionen werden in der Methodentabelle gespeichert. Bei einem Aufruf wird der Code aus dieser Tabelle ausgeführt, also gemeinsam von allen Instanzen genutzt.
static void Main(string[] args)
{
Factory factoryFox = new Factory();
Robot robot1 = new Robot();
Robot robot2 = new Robot();
Robot robot3 = new Robot();
robot1.name = "Tom";
robot2.name = "Jack";
robot3.name = "Smith";
robot1.SayHello();
robot2.SayHello();
robot3.SayHello();
}Code-Sprache: C# (cs)
In diesem Code rufen alle drei Aufrufe von SayHello dieselbe Funktion auf. Lokale Variablen innerhalb der Methode bleiben voneinander abgegrenzt, der Zugriff auf Felder hängt davon ab, welche Instanz den Aufruf auslöst.
public void SayHello()
{
Console.WriteLine($"Hello everyone my name is {name},I come from Foxdevelop.com");
}Code-Sprache: C# (cs)
Wenn robot1 SayHello aufruft, ist name Tom. Bei einem Aufruf durch robot2 lautet name Jack usw.
Instanzmember