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

时间:2016-08-25 16:13:30

标签: c# dynamic

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

哪种变体更适合使用?这些方法的表现怎么样?

2 个答案:

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

请注意,以上是过度设计的例子。还有其他事情要考虑(例如,公共抽象方法是正确的做法!)