Warum sollten wir in Constructor keine virtuellen Methoden aufrufen?

Warum sollten wir in Constructor keine virtuellen Methoden aufrufen?

In diesem Artikel möchte ich Ihnen zeigen, wie es potenziell gefährlich sein kann, virtuelle Methoden im Konstruktor aufzurufen.
Bevor Sie weiter in den Artikel gehen, können Sie hier mehr über virtuelle Methoden erfahren und wie virtuelle Methoden aufgerufen werden hier

Bitte sehen Sie sich das unten gezeigte Code-Snippet an

    public class BaseClass
    {
        protected string LocalStr;
        public BaseClass()
        {
            PrintString();
            Console.WriteLine(LocalStr.ToUpper());
        }

        public virtual void PrintString()
        {
            LocalStr = "Vikram Chaudhary";
        }
    }

Wenn ich eine Instanz dieser Klasse erstelle und den Code ausführe, erhalten wir die gewünschte Ausgabe wie unten gezeigt.

        static void Main(string[] args)
        {
            BaseClass baseInst = new BaseClass();//"VIKRAM CHAUDHARY" as output
            Console.ReadLine();
        }

Aber der Implementierer der abgeleiteten Klasse dieser Klasse ist sich dieser Tatsache nicht bewusst, dass er die LocalStr-Variable richtig handhaben muss, wenn sie aufgerufen und nach dem Aufruf der virtuellen Methode manipuliert wird. Angenommen, wir haben eine abgeleitete Klasse erstellt, wie unten gezeigt

    public class DerivedClass : BaseClass
    {
        public override void PrintString()
        {
            LocalStr = null;
        }
    }

Der Entwickler dieser Klasse hat entschieden, die LocalStr-Variable auf null zu setzen. Wenn wir nun wie unten gezeigt eine Instanz der abgeleiteten Klasse erstellen, erhalten wir eine „Objektreferenz, die nicht auf eine Instanz eines Objekts festgelegt ist“. Ausnahme, da beim Erstellen einer Instanz der abgeleiteten Klasse zuerst der Konstruktor der Basisklasse aufgerufen wird, der wiederum die überschriebene Version der PrintString()-Methode aufruft, die die LocalStr-Variable auf null setzt.