在构造函数中调用虚方法:为什么危险以及如何避免?
大家好!我是一名初学 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",但有时会得到意外行为。为什么会这样?因为基类构造函数是在派生类构造函数之前调用的。