¿Por qué no deberíamos llamar a métodos virtuales en Constructor?

¿Por qué no deberíamos llamar a métodos virtuales en Constructor?

En este artículo, quiero mostrarle cómo puede ser potencialmente peligroso llamar a métodos virtuales en el constructor.
Antes de continuar con el artículo, puede obtener más información sobre los métodos virtuales aquí y cómo se llaman los métodos virtuales aquí

Eche un vistazo al fragmento de código que se muestra a continuación

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

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

Si creo una instancia de esta clase y ejecuto el código, obtendremos el resultado deseado como se muestra a continuación.

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

Pero el implementador de la clase derivada de esta clase no es consciente de este hecho de que necesita manejar correctamente la variable LocalStr a medida que se llama y manipula después de la llamada al método virtual. Supongamos que hemos creado una clase derivada como se muestra a continuación

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

El desarrollador de esta clase ha decidido establecer la variable LocalStr como nula. Ahora, si creamos una instancia de la clase derivada como se muestra a continuación, obtendremos una "Referencia de objeto no establecida como una instancia de un objeto". excepción ya que al crear una instancia de la clase derivada, primero se llama al constructor de la clase base, que a su vez llama a la versión anulada del método PrintString() que establece la variable LocalStr en nulo.