CodeQL 文档

“this”的可疑类型测试

ID: cs/type-test-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 也依赖于 Derived ,从而导致这两种类型之间出现依赖循环。依赖循环是一种众所周知的设计缺陷,因为它们使代码既难以阅读又难以测试。

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

建议

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

示例

在本例中,BaseClass 尝试检查自身的实例,以查看它们是哪个子类,然后根据结果执行不同的操作。这是非常糟糕的做法。

class DubiousTypeTestOfThis
{
    class BaseClass
    {
        public int add(int x)
        {
            if (this is FiveAdder)
                return x + 5;

            if (this is TenAdder)
                return x + 10;

            return 0;
        }
    }

    class FiveAdder : BaseClass
    {
        // ...
    }

    class TenAdder : BaseClass
    {
        // ...
    }
}
  • ©GitHub, Inc.
  • 条款
  • 隐私