构造函数或析构函数中的虚调用¶
ID: cs/virtual-call-in-constructor
Kind: problem
Security severity:
Severity: warning
Precision: medium
Tags:
- reliability
- maintainability
- modularity
Query suites:
- csharp-security-and-quality.qls
构造函数或析构函数中的虚调用或访问可能不会按预期方式运行。基类的构造函数始终首先执行,但在对象的运行时类型的上下文中执行。如果在子类型中重写了方法,则可以从基类型的构造函数调用该重写的方法。这可能导致在类的构造函数之前调用类的方法,这可能会产生意外的后果。
建议¶
仔细检查虚调用或访问,以确保它们按预期方式运行。如果可能,请消除虚调用。
示例¶
在此示例中,在调用 DClass
构造函数之前调用了 DClass.Method()
。这是一个问题,因为 DClass
的 Method()
版本不希望在构造函数之前调用。
class VirtualCallInConstructorOrDestructor
{
class BaseClass
{
protected String classReady = "No";
public BaseClass()
{
Console.WriteLine("Base constructor called.");
Method();
}
public virtual void Method()
{
Console.WriteLine("Base method called.");
}
}
class DClass : BaseClass
{
public DClass()
{
Console.WriteLine("D constructor called.");
classReady = "Yes";
}
public override void Method()
{
Console.WriteLine("D method called. Ready for method to be called? " + classReady);
}
}
public static void Main(string[] args)
{
BaseClass x = new DClass();
}
}
此示例输出以下内容
Base constructor called.
D method called. Ready for method to be called? No
D constructor called.