如何优化具有空检查的as操作序列

本文关键字:检查 as 操作 何优化 优化 | 更新日期: 2023-09-27 18:09:33

我想优化以下序列,因为运行时具有线性增长,我添加的as-Operations越多。是否有更智能的方法在同一类中实现这一点,而无需使用进一步的helper类/模式?提前感谢(并对编辑表示抱歉…)!

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);
}

如何优化具有空检查的as操作序列

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

一般来说,这被称为多态性,其中您可以在将多个派生类作为基类进行交互时将它们视为相同的。

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