Konstruktoren, Destruktoren und this in C#
Lernen Sie Konstruktoren, Destruktoren und das Schlüsselwort this in C# zur Verwaltung des Objektlebenszyklus.
In C# verfügen Klassen und Strukturen über spezielle Methoden, die festlegen, wie Objekte erstellt und zerstört werden. Ein Konstruktor wird beim Erstellen eines Objekts ausgeführt und weist Anfangswerte zu. Ein Destruktor wird aufgerufen, kurz bevor ein Objekt aus dem Speicher entfernt wird. Das Schlüsselwort this verweist auf die aktuelle Instanz der Klasse und wird insbesondere bei gleichnamigen Parametern oder beim Method Chaining verwendet.
Konstruktor
Ein Konstruktor ist eine spezielle Methode, die denselben Namen wie die Klasse trägt. Er wird automatisch ausgeführt, wenn ein neues Objekt erstellt wird, und wird in der Regel verwendet, um Anfangswerte zu setzen. Er kann Parameter annehmen und überladen werden. Wenn kein Konstruktor definiert ist, fügt C# automatisch einen Standardkonstruktor (parameterlos) hinzu.
public class Product
{
public string Name { get; set; }
public decimal Price { get; set; }
// Parameterloser Konstruktor
public Product()
{
Name = "Unbekannt";
Price = 0;
}
// Konstruktor mit Parametern
public Product(string name, decimal price)
{
Name = name;
Price = price;
}
public void Print()
{
Console.WriteLine($"{Name} - {Price:0.00} EUR");
}
}
class Program
{
static void Main()
{
var p1 = new Product(); // parameterlos
var p2 = new Product("Notebook", 45m); // mit Parametern
p1.Print(); // Unbekannt - 0.00 EUR
p2.Print(); // Notebook - 45.00 EUR
}
}
Destruktor
Ein Destruktor wird definiert, indem dem Klassennamen ein ~ vorangestellt wird, und er kann keine Parameter annehmen.
Er wird unmittelbar vor der Speicherbereinigung durch den Garbage Collector aufgerufen.
Obwohl er für Aufräumarbeiten wie das Schließen von Dateien oder das Freigeben von Speicher genutzt werden kann,
ist ein manueller Destruktor dank des Garbage Collectors in den meisten Fällen nicht notwendig.
public class Logger
{
public Logger()
{
Console.WriteLine("Logger gestartet.");
}
~Logger()
{
Console.WriteLine("Logger aus dem Speicher bereinigt.");
}
}
class Program
{
static void Main()
{
var log = new Logger();
log = null;
// Garbage Collector auslösen
GC.Collect();
GC.WaitForPendingFinalizers();
}
}
Das Schlüsselwort this
this verweist auf die aktuelle Instanz einer Klasse.
Es wird verwendet, um Parameter und Eigenschaften mit demselben Namen zu unterscheiden,
zum Method Chaining oder um innerhalb derselben Klasse einen anderen Konstruktor aufzurufen.
public class Customer
{
public string Name { get; set; }
public string Email { get; set; }
// Konstruktor mit gleichnamigen Parametern wie Properties
public Customer(string name, string email)
{
this.Name = name; // Zuweisung mit this
this.Email = email;
}
// Method Chaining
public Customer SetName(string name)
{
this.Name = name;
return this;
}
public Customer SetEmail(string email)
{
this.Email = email;
return this;
}
public void Print()
{
Console.WriteLine($"{Name} - {Email}");
}
}
class Program
{
static void Main()
{
var c = new Customer("John", "john@example.com")
.SetName("Michael")
.SetEmail("michael@example.com");
c.Print(); // Michael - michael@example.com
}
}
Konstruktoraufruf mit this
Mit this(...) kann ein Konstruktor innerhalb derselben Klasse einen anderen Konstruktor aufrufen.
Dieser Ansatz reduziert doppelten Code und zentralisiert gemeinsame Initialisierungen.
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
public Person(string name) : this(name, 0) // ruft den anderen Konstruktor auf
{
}
public Person(string name, int age)
{
Name = name;
Age = age;
}
public void Print()
{
Console.WriteLine($"{Name} ({Age})");
}
}
class Program
{
static void Main()
{
var p1 = new Person("Alice");
var p2 = new Person("Maria", 25);
p1.Print(); // Alice (0)
p2.Print(); // Maria (25)
}
}
TL;DR
- Konstruktor: Läuft beim Erstellen eines Objekts und weist Anfangswerte zu.
- Destruktor: Wird vor dem Entfernen eines Objekts aus dem Speicher aufgerufen; selten notwendig, da der GC die Bereinigung übernimmt.
- this: Verweist auf das aktuelle Objekt; dient zur Unterscheidung von Parametern und Properties, zum Method Chaining und zum Aufruf anderer Konstruktoren.