在C#中实现一个由多种类型的对象组成的堆栈的最佳方式是什么

本文关键字:对象 类型 堆栈 是什么 方式 最佳 种类 实现 一个 | 更新日期: 2023-09-27 17:48:48

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

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

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

这可以正常工作,但产生的类型测试和下转换感觉很笨拙。

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

在C#中实现一个由多种类型的对象组成的堆栈的最佳方式是什么

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

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

这有道理吗?

如果没有BackTrack,那么将BackTrack对象放入并使其为null有什么问题?您可以添加一个有用的属性,如bool IsBacktrack{get{return _backTrack!=null;}}

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

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

如果这对你不起作用,那么你可以在myStack[x].GetType()上切换

这取决于您期望的抽象级别。基类方法非常好。只有当基准测试显示以这种方式损失了太多性能时,我才会尝试深入研究,也许可以使用具有显式内存布局的自定义定制结构,其作用类似于union

你的代码是如何以负面的方式影响可用性的?