繁体   English   中英

如何使用空检查优化一系列 as 操作?

[英]How to optimize a sequence of as-operations with null checks?

我想优化下面的序列,因为运行时间是线性增长的,我添加的 as-Operations 越多。 有没有更聪明的方法在同一个类中实现这个而不使用更多的帮助类/模式? 提前致谢(并对编辑感到抱歉..)!

public void SomeMethod(ClassZero foo)
{
    var targetName = "";

    var a = foo as ClassA;
    if (a != null) targetName = a.DoSomething();

    var b = foo as ClassB;
    if (b != null) targetName = b.DoSomethingElse();

    var c = foo as ClassC;
    if (c != null) targetName = c.DoSomethingEntirelyElse();

    var d = foo as ClassD;
    if (c != null) targetName = d.DoSomethingInAnotherParallelWorld();

    var furtherUse = localVariable.Process(targetName);
}

理想情况下,不是查询类型的基类并选择不同的公共方法,而是对基类(或者更好的接口)进行单个方法调用,无论底层实现如何,都可以调用该方法。

通常,这称为多态性,其中您可以在将多个派生类作为其基类进行交互时将它们视为相同。

public void SomeMethod(ClassZero foo)
{
    var targetName = "";

    targetName = foo.GetTargetName();

    var furtherUse = localVariable.Process(targetName);
}

和其他地方:

public abstract class ClassZero
{
    public abstract string GetTargetName();
}

public class ClassA : ClassZero
{
    public override string GetTargetName()
    { 
        return DoSomething();
    }
}

public class ClassB : ClassZero
{
    public override string GetTargetName()
    { 
        return DoSomethingElse();
    }
}

或者,您可以使用接口。 这通常是首选,因为它是关于一个类的显式契约,它提供了一个函数,在这种情况下,获取 TargetName。 与在抽象基类上具有抽象方法相比,它的混淆程度要低一些。 如果您不拥有 ClassZero 基类,这也很好。

public interface ITargetNameGenerator
{
    string GetTargetName();
}

public void SomeMethod(ITargetNameGenerator foo)
{
    var targetName = "";

    targetName = foo.GetTargetName();

    var furtherUse = localVariable.Process(targetName);
}


public class ClassA : ClassZero, ITargetNameGenerator
{
    public string GetTargetName()
    {
        return DoSomething();
    }
}
//etc...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM