gpt4 book ai didi

c# - 如何使用空检查优化一系列 as-operations?

转载 作者:太空宇宙 更新时间:2023-11-03 21:08:14 25 4
gpt4 key购买 nike

我想优化下面的序列,因为runtime是线性增长的,我加的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)方法,不如在基类(或者,更好的是接口(interface))上调用一个方法,无论底层实现如何都可以调用.

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

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

或者,您可以使用接口(interface)。这通常是首选,因为它是关于类的显式契约,它提供了一个函数来获取 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...

关于c# - 如何使用空检查优化一系列 as-operations?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39771712/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com