我有简单的类层次结构(基类A,派生类B:A,派生类C:A等)。我有以下代码:
void computation(A base_class)
{
if (base_class is B)
{
//Do some stuff with (base_class as B)
}
if (base_class is C)
{
//Do some stuff with (base_class as C)
}
}
我记得c#语言的动态关键字。据我所知,我可以使用以下代码(以优化额外的转换)。
void computation(A base_class)
{
dynamic temp = base_class as B;
if (temp != null)
{
//Do some stuff with temp
}
temp = base_class as C;
if (temp != null)
{
//Do some stuff with (base_class as C)
}
}
哪种变体更适合使用?这些方法的表现怎么样?
答案 0 :(得分:5)
这闻起来像是过早优化,我不喜欢这里的dynamic
用法。
另请注意,dynamic
执行特定操作(引自MSDN):
动态类型使其发生的操作可以绕过编译时类型检查。相反,这些操作在运行时解决。
所以我想绕过编译时类型检查不是你想要的。
我建议改用var
。 Imho它提高了可读性,调试更容易,使用as
代替is
+ 投射也快一点。
void computation(A base_class)
{
var b = base_class as B;
if (b != null)
{
//Do some stuff with temp
}
var c = base_class as C;
if (c != null)
{
//Do some stuff with (base_class as C)
}
}
答案 1 :(得分:5)
你有一个继承层次结构,但在运行时你需要知道你要处理的具体课程,以便知道该怎么做 - 你有可能做错了!
public abstract class A
{
public abstract void DoSomething();
}
public class B: A
{
public override void DoSomething() { .. do B's thing ... }
}
public class C : A
{
public override void DoSomething() { .. do C's thing ... }
}
...
public void Consumer(A a)
{
a.DoSomething(); // calls the right DoSomething, B or C.
}
...
请注意,以上是过度设计的例子。还有其他事情要考虑(例如,公共抽象方法是正确的做法!)