Command接口必须定义Execute()和Undo()方法命令对象需保存执行前状态撤销/重做用双栈管理防内存泄漏需弱引用或剥离UI依赖WPF/WinForms需结合ViewModel或CommandManager封装不可逆操作应规避或伪可逆处理。Command 接口怎么定义才支持撤销和重做关键不是“实现 ICommand”而是接口必须包含 Execute()、Undo() 两个方法且命令对象得能保存执行前的状态或反向操作所需数据。常见错误是只实现 Execute()或者把状态存在 UI 控件里——一旦控件重建Undo() 就失效。实操建议用泛型基类封装公共逻辑比如 class BaseCommandtstate : ICommand/tstate让子类专注处理 TState 的快照与还原避免在 Execute() 中直接修改 UI 控件属性改用数据模型驱动命令只操作模型再由绑定机制更新视图如果操作涉及异步如文件保存Undo() 不能简单“倒放”得预存原始内容而不是依赖当前磁盘状态如何管理命令历史栈并防止内存泄漏撤销/重做本质是两个栈undoStack 存已执行的命令redoStack 存刚被 Undo() 推出的命令。容易踩的坑是命令对象强引用了窗体、控件或大对象如图像、文档全文导致整个页面无法 GC。实操建议用 WeakReference 包装对 UI 对象的引用仅当必须时或彻底剥离 UI 依赖靠事件或回调通知界面刷新限制栈大小例如只保留最近 100 条命令if (undoStack.Count 100) undoStack.RemoveAt(0)每次 Execute() 后清空 redoStack——用户新操作意味着“重做”历史失效这是多数人忽略的语义细节WPF 或 WinForms 里怎么把按钮点击转成 Command 实例不是绑 ICommand 就完事。WPF 的 Button.Command 属性只支持 ICommand但默认不触发 Undo()WinForms 更没原生支持得手动 hook Click 事件。 唱鸭 音乐创作全流程的AI自动作曲工具集 AI 辅助作词、AI 自动作曲、编曲、混音于一体