我正在尝试优化我的代码的某个部分,这恰好处于一个紧密的性能循环中。主要是我想学习新的东西,我可以在未来应用。我的实现非常冗长,所以我将给出一个我想要实现的一般示例。
我的问题与此有关:C# 'is' operator performance,尤其是所选答案。
假设我有一个类 A。我还有一个类 B,它派生自 A。我有一个类型 A 的列表(其中包含 A 和 B 类型的混合)。在我处理这些项目的方法中,我想根据对象的实际类型实现某种行为(不确定这是否是正确的说法。请在我说错的地方纠正我)。
void Process(A item)
{
if (item is A)
{
DoBehavior((A)item); //I know the cast is redundant here, I'm just leaving
//it here for my explanation.
}
else if (item is B)
{
DoBehavior((B)item);
}
}
void DoBehaviour(A item)
{
//perform necessary behaviour for type A
}
void DoBehaviour(B item)
{
//perform necessary behaviour for type B
}
这是我目前的做法。请注意,我遍历了包含 A 和 B 的类型 A 的列表。另外,如果您觉得我没有提供足够的代码来澄清这种情况,我会很乐意扩展。
在我上面发布的问题:C# 'is' operator performance中,我了解到我可以更改结构以使用“as”运算符,并完全摆脱显式强制转换。
B bItem = item as B;
if (bItem != null)
{
DoBehavior(bItem);
}
这一切都很好,然而,实际上我不仅有一个 A 和一个 B,我还有一个 C、一个 D 等等,它们都是从基类 A 派生的。这将导致许多这样的 if 语句,并且它们必须嵌套以获得最佳性能:
B bItem = item as B;
if (bItem != null)
{
DoBehavior(bItem);
}
else
{
C cItem = item as C;
if (cItem != null)
{
DoBehavior(cItem);
}
else
{
//and so on.
}
}
现在这很丑陋。我喜欢编写整洁、优雅的代码,但我在这方面做得特别差(这常常导致我浪费时间试图让事情看起来更好一点)。
我希望这个问题不要太宽泛,但首先我想知道在获取类型时是否有更优化和更干净的解决方案,以便执行相关行为。如果没有,有没有比这样嵌套更清洁的方式来使用这些“as”运算符?
我想一种替代方法是将行为移到基类 A 中,然后为每个派生类覆盖它。然而,在更高的思维意义上,我这个特殊情况下的行为不是 A 类(或者它的孩子)的行为,而是一些外部类在它上面的行为/行为(对于每种类型,它的行为会有所不同)。如果没有更好的方法来做到这一点,我将强烈考虑实施它,正如我现在解释的那样 - 但我希望对此有一些专家意见。
我试图保持简短,并且可能遗漏了太多细节。让我知道是否是这种情况。