我应该使用动态关键字来优化转换吗?



我有简单的类层次结构(基类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)
    }
}

哪个变体更适合使用?这些方法的性能如何?

这听起来像是过早的优化,我不喜欢这里的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)
    }
}

如果你有一个继承层次结构,但是在运行时你需要知道你正在处理的具体类是什么,以便知道该做什么——很可能你做错了!

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.
}
...

请注意,上面是一个过于做作的例子。还有其他需要考虑的事情(比如,一个公共抽象方法是正确的吗?)

最新更新