代码之家  ›  专栏  ›  技术社区  ›  Paul Moore

在C#中实现一个包含多种类型对象的堆栈的最佳方法是什么?

  •  2
  • Paul Moore  · 技术社区  · 17 年前

    我正在用C#编写一个虚拟机的实现,我需要实现VM的堆栈,它可以包含两种类型的条目——返回条目或回溯条目。实现这一目标的最佳方式是什么?

    我目前使用的是基本类型,如下所示:

    class StackEntry { }
    class Return : StackEntry { uint pc; }
    class Backtrack : StackEntry { uint pc; object backtrack; }
    
    Stack<StackEntry> stack;
    

    这工作得很好,但最终的类型测试和向下投射感觉很笨拙。

    有没有更好的方法来处理这种类型的建筑?

    4 回复  |  直到 17 年前
        1
  •  6
  •   Mike Burton    17 年前

    我很难想象你将如何使用它,但基本的答案是,你使用一个带有默认操作的单一类型进行弹出后处理

    StackEntry { protected virtual void PostPop(); }
    Return : StackEntry { protected override void PostPop(); }
    Backtrack : StackEntry { protected override void PostPop(); }
    

    这有道理吗?

        2
  •  3
  •   plinth    17 年前

    不管怎样,把BackTrack对象放进去,如果没有回溯,让它为null有什么错?您可以添加一个有用的属性,如bool IsBacktrack{get{return _backTrack!=null;}}

    回溯可以有效地为空吗?如果是,则使用bool标志。

        3
  •  2
  •   Andrew Bullock    17 年前

    你为什么需要往下看?如果你的基类公开了抽象或虚拟成员,或者是一个接口,你应该没有问题。这一原则是面向对象编程的基础。

    如果这对你不起作用,那么你可以打开myStack[x]。GetType()

        4
  •  0
  •   Konrad Rudolph    17 年前

    这取决于您期望的抽象级别。基类方法相当不错。只有当基准测试显示以这种方式损失了太多的性能时,我才会尝试更深入地挖掘,也许会使用一个具有显式内存布局的定制结构,其行为类似于C语言 union .

    你的代码对可用性有何负面影响?