对“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
如果类型 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;
}
}
}