Objektorientierung: Konstruktor und Destruktor
Der Konstruktor ist eine spezielle Funktion, welche bei der Initialisierung (also dem Erstellen) einer Klasse aufgerufen wird. Der Name der Konstruktor-Funktion entspricht immer dem Klassennamen. Die Funktion besitzt keinen Rückgabewert (auch nicht void), da der Konstruktor sozusagen das neu initialisierte Objekt zurückgibt. Wird kein Konstruktor in der Klasse erstellt, gibt es immer einen sogenannten Standard-Konstruktor, welcher keine weiteren Aktionen ausführt. Der Standard-Konstruktor besitzt keine Parameter. Jedoch kann dies bei der Implementierung eigener Konstruktoren geändert werden. Des Weiteren ist auch die Überladung des Konstruktors möglich. Wichtig zu wissen ist, dass sobald Konstruktoren in der Klasse deklariert werden, es den Standard-Konstruktor den C# automatisch erstellt, nicht mehr gibt. Der Zugriffsmodifizierer bei Konstruktoren ist normalerweise public. Wird als Zugriffsmodifzierer private verwendet, ist die Objektinitialisierung dieser Klasse nicht mehr möglich. Der private Konstruktor wird deshalb verwendet, um die Objektinitialisierung einer Klasse, welche lediglich statische Funktionen enthält, zu unterbinden.
Der Destruktor ist das Gegenteil des Konstruktors, da der Destruktor aufgerufen wird, wenn das Objekt zerstört / gelöscht wird. Wie bereits angesprochen, wird ein Objekt (welches auf dem Heap gespeichert ist) automatisch gelöscht, sobald das .NET Framework keine Referenzierung mehr findet. Dieses Löschen der Objekte geschieht automatisch durch den Garbage Collector (kurz GC), wenn das Programm aktuell keine Vorgänge zu bearbeiten hat oder der Speicherplatz kritisch wird. Des Weiteren ist es auch möglich, über die statische Funktion Collect() der Klasse GC das Löschen unreferenzierter Objekte manuell auszulösen. Der Name des Destruktors entspricht ebenfalls dem Klassennamen, jedoch mit einem vorangestellten Tilde-Zeichen (~). Beim Destruktor darf des Weiteren kein Zugriffsmodifizierer und Rückgabewert angegeben werden.
Program.cs
using System; namespace CSV20.Konstruktor_Destruktor { class Program { static void Main(string[] args) { Console.WriteLine("Main: Programm gestartet -> rufe Funktion auf"); TestFunktion(); Console.WriteLine("Main: Funktion verlassen -> Programm zu Ende"); Console.ReadKey(); } private static void TestFunktion() { Computer oComputer; Console.WriteLine("Fuktion: Funktion aufgerufen -> Erstelle Objekt"); oComputer = new Computer(); Console.WriteLine("Fuktion: Objekt erstellt -> ändere Eigenschaften"); oComputer.HdmiVorhanden = true; Console.WriteLine("Fuktion: Eigenschaften geändert -> zeige Info"); oComputer.ZeigeInfo(); Console.WriteLine("Fuktion: Info angezeigt -> zerstöre Objekt (Taste drücken, für weiter)"); // Referenz entfernen, dadurch wird das Objekt nicht mehr adressiert // und kann unten über den Funktionsaufruf gelöscht werden oComputer = null; // Variablen würden beim Verlassen der Funktion gelöscht werden, // Objekte werden jedoch nicht automatisch sofort gelöscht // Um das sofortige Löschen zu veranlassen, kann folgendes aufgerufen werden GC.Collect(); Console.ReadKey(); Console.WriteLine("Fuktion: Objekt zerstört -> verlasse Funktion"); // Info: die Refernz zu entfernen ist normalerweise nur bei globalen Variablen notwendig, // im Beispiel ist es jedoch ebenfalls notwendig, da sonst die Funktion für den GC das Objekt nicht löscht } } }
Computer.cs
using System; namespace CSV20.Konstruktor_Destruktor { public class Computer { private int iFestplattenGröße; // Variable wird im Konstruktor initialisiert public bool HdmiVorhanden { get; set; } public int FestplattenGröße { get { return iFestplattenGröße; } set { // nur Größen von 32 GB bis 4 TB erlaubt if (value >= 32 && value <= 4096) iFestplattenGröße = value; } } public Computer() { iFestplattenGröße = 256; // auch "this.iFestplattenGröße = 256;" möglich Console.WriteLine("Objekt: Objekt erstellt"); } ~Computer() { Console.WriteLine("Objekt: Objekt zerstört"); } public void ZeigeInfo() { Console.WriteLine("Computer-Info:"); Console.WriteLine(" > Die Festplatte ist {0} GB groß", iFestplattenGröße); if (HdmiVorhanden) Console.WriteLine(" > HDMI-Anschluss ist vorhanden"); } } }
![Download starten Download](/images/CSharp/Download.png)
![zum vorherigen Thema Links](/images/Links.png)
![zum nächsten Thema Rechts](/images/Rechts.png)