“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
如果类型 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
{
// ...
}
}