Avatar ·

在构造函数中调用虚方法:为什么危险以及如何避免?

大家好!我是一名初学 C# 的开发者,遇到了一个问题。我使用 ReSharper 时注意到它发出警告:“在构造函数中调用虚成员”。我有一个基类 `Animal` 和一个派生类 `Dog`。在 `Animal` 的构造函数中,我调用了虚方法 `Speak()` 来设置默认名称。示例如下: ```csharp public class Animal { public string Name { get; set; } public Animal() { // ReSharper: 在构造函数中调用虚成员 InitializeName(); } public virtual void InitializeName() { Name = "Unknown animal"; } } public class Dog : Animal { public override void InitializeName() { Name = "Buddy"; Console.WriteLine("Dog initialized!"); } } ``` 当我创建 `Dog dog = new Dog();` 时,我期望名称是 "Buddy",但有时会得到意外行为。为什么会这样?因为基类构造函数是在派生类构造函数之前调用的。