CodeQL 文档

构造函数或析构函数中的虚调用

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

点击查看 CodeQL 代码库中的查询

构造函数或析构函数中的虚调用或访问可能不会按预期方式运行。基类的构造函数始终首先执行,但在对象的运行时类型的上下文中执行。如果在子类型中重写了方法,则可以从基类型的构造函数调用该重写的方法。这可能导致在类的构造函数之前调用类的方法,这可能会产生意外的后果。

建议

仔细检查虚调用或访问,以确保它们按预期方式运行。如果可能,请消除虚调用。

示例

在此示例中,在调用 DClass 构造函数之前调用了 DClass.Method()。这是一个问题,因为 DClassMethod() 版本不希望在构造函数之前调用。

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.
  • ©GitHub 公司
  • 条款
  • 隐私