Wie man den Basiskonstruktor in C# richtig aufruft

Bei der Arbeit mit objektorientierter Programmierung in C#, insbesondere im Umgang mit Vererbung, werden Sie oft die Notwendigkeit feststellen, Daten von einer abgeleiteten Klasse an ihre Basisklasse zu übergeben. Dies ist entscheidend, um sicherzustellen, dass Eigenschaften und Verhaltensweisen, die in der Basisklasse definiert sind, ordnungsgemäß initialisiert werden. In diesem Blogbeitrag konzentrieren wir uns speziell darauf, wie man den Basiskonstruktor effektiv aufruft, wenn man von einer Klasse wie Exception erbt.

Das Problem

Stellen Sie sich vor, Sie erstellen eine benutzerdefinierte Ausnahme-Klasse, die von der integrierten Exception-Klasse in C# erbt. Ihr Ziel ist es, zusätzliche Informationen (wie eine Nachricht) an den Konstruktor der Exception-Klasse zu übergeben. Viele Entwickler stoßen jedoch auf Herausforderungen, wenn sie dies versuchen. Ihr Versuch könnte ungefähr so aussehen:

class MyExceptionClass : Exception
{
     public MyExceptionClass(string message, string extraInfo)
     {
         //Hier läuft alles schief
         base(message);
     }
}

In diesem Code-Snippet könnten Sie verwirrt sein, warum Sie auf Fehler stoßen. Der Grund liegt in der falschen Art und Weise, wie Basiskonstruktoren aufgerufen werden. Lassen Sie uns das aufschlüsseln und den richtigen Ansatz verstehen.

Die Lösung

Um Parameter korrekt an den Konstruktor der Basisklasse in C# zu übergeben, müssen Sie eine spezifische Syntax verwenden, die es Ihnen ermöglicht, dies direkt in der Initialisierer-Liste des Konstruktors der abgeleiteten Klasse zu tun. Hier ist, wie Sie Ihre ursprüngliche Implementierung korrigieren:

Die korrekte Syntax

Hier ist die modifizierte Version Ihrer Klasse:

public class MyExceptionClass : Exception
{
    public MyExceptionClass(string message, string extraInfo) : base(message)
    {
        //andere Dinge hier
    }
}

Wichtige Änderungen erklärt

  1. Verwendung der Konstruktor-Initialisierer-Liste: Beachten Sie, dass wir jetzt : base(message) direkt nach den Konstruktorparametern einfügen. Dies sagt C#, den Konstruktor der Basisklasse (Exception) aufzurufen und ihm das Argument message zu übergeben.

  2. Verständnis der Einschränkungen bei Konstruktoraufrufen: In C# ist ein Konstruktor keine reguläre Methode und kann nicht wie eine normale Methode aufgerufen werden, sobald der Konstruktor-Körper beginnt. Aus diesem Grund würde die vorherige Methode, base(message) innerhalb des Methoden-Körpers zu verwenden, nicht funktionieren.

  3. Zusätzliche Parameter: Wenn Sie den zusätzlichen Parameter extraInfo verwenden möchten, können Sie den Konstruktor weiter ausbauen und ihn möglicherweise für eine spätere Verwendung in Ihrer benutzerdefinierten Ausnahme-Klasse speichern.

Beispiel zur Nutzung beider Parameter

Wenn Sie zusätzliche Logik für extraInfo einfügen möchten, könnte Ihre Klasse ungefähr so aussehen:

public class MyExceptionClass : Exception
{
    public string ExtraInfo { get; private set; }

    public MyExceptionClass(string message, string extraInfo) : base(message)
    {
        ExtraInfo = extraInfo; // Zusätzliche Informationen für später speichern
    }
}

Fazit

Durch die Befolgung der korrekten Syntax zur Aufrufung des Konstruktors der Basisklasse können Sie sicherstellen, dass Ihre C#-Klassenhierarchien korrekt eingerichtet sind. Dies ist besonders wichtig beim Arbeiten mit Ausnahmen, da es dazu beiträgt, Klarheit und Funktionalität in Ihren Fehlerbehandlungsroutinen zu erhalten. Denken Sie daran, immer die Initialisierer-Liste zu verwenden, um Parameter an Basiskonstruktoren zu übergeben!

Für weitere Lektüre und Erkundung von C#-Vererbung und Konstruktoren sollten Sie in die offizielle Microsoft-Dokumentation oder andere Programmierressourcen eintauchen.