Avatar ·

Chamada de método virtual no construtor: por que é perigoso e como evitar?

Olá a todos! Sou um desenvolvedor C# iniciante e tive um problema. Uso o ReSharper e notei que ele emite um aviso: «Virtual member call in a constructor». Tenho uma classe base `Animal` e uma derivada `Dog`. No construtor de `Animal`, chamo o método virtual `Speak()` para definir um nome padrão. Eis o exemplo: ```csharp public class Animal { public string Name { get; set; } public Animal() { // ReSharper: Virtual member call in a constructor InitializeName(); } public virtual void InitializeName() { Name = "Unknown animal"; } } public class Dog : Animal { public override void InitializeName() { Name = "Buddy"; Console.WriteLine("Dog initialized!"); } } ``` Quando crio `Dog dog = new Dog();`, espero que o nome seja "Buddy", mas às vezes obtenho um comportamento inesperado. Por que isso acontece? Afinal, o construtor da classe base é chamado antes do construtor...