CodeQL 文档

对“this”的可疑向下转型

ID: cs/downcast-of-this
Kind: problem
Security severity: 
Severity: warning
Precision: high
Tags:
   - testability
   - maintainability
   - language-features
Query suites:
   - csharp-security-and-quality.qls

点击查看 CodeQL 存储库中的查询

如果类型 Derived 继承(直接或间接)自类型 Base ,则它依赖于 Base,因为这种继承关系 - 也就是说,如果没有 Base,它就不能使用。如果除了使 Derived 继承自 Base 之外,您还编写了依赖于 Derived 的代码(位于 Base 内部),则会导致 Base 也依赖于 Derived ,从而导致两种类型之间出现循环依赖关系。循环依赖关系是一种众所周知的代码异味,因为它会使代码既难以阅读又难以测试。

在刚才描述的情况下,循环依赖关系是通过编写将 this 的类型强制转换为派生类型的代码引入的。这是一个非常不明智的做法 - 类型永远不应该知道它的特定后代,尽管它当然可以选择对它们作为一个组施加一些约束(例如,需要每个派生类型实现具有特定签名的方法)。

建议

解决此问题的适当方法是重新设计基类和派生类,以便基类不再需要依赖于从它派生的类型。

示例

在此示例中,BaseClass 尝试将自身向下转换为各种已知的子类,以便调用特定于这些子类的方法。这是非常糟糕的做法。

class DubiousDowncastOfThis
{
    class BaseClass
    {
        public int doAnything(int x)
        {
            DerivedA a = this as DerivedA;
            if (a != null)
                return a.doSomething(x);

            DerivedB b = this as DerivedB;
            if (b != null)
                return b.doSomethingElse(x);

            return 0;
        }
    }

    class DerivedA : BaseClass
    {
        public int doSomething(int x)
        {
            return x + 5;
        }
    }

    class DerivedB : BaseClass
    {
        public int doSomethingElse(int x)
        {
            return x + 10;
        }
    }
}
  • ©GitHub 公司
  • 条款
  • 隐私