- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试使用 C# 委托(delegate)实现撤消功能。基本上,我有一个 UndoStack,它维护一个实现每个撤消操作的委托(delegate)列表。当用户选择 Edit:Undo 时,此堆栈弹出第一个委托(delegate)并运行它。每个操作负责将适当的撤消委托(delegate)推送到堆栈。假设我有一个名为“SetCashOnHand”的方法。它看起来像这样:
public void SetCashOnHand(int x) {
int coh = this.cashOnHand;
undo u = () => this.setCashOnHand(coh);
this.cashOnHand = x;
undoStack.Push(u);
}
因此此方法构造一个撤消委托(delegate),执行操作,然后(假设它成功)将撤消委托(delegate)推送到 UndoStack 上。 (UndoStack 足够聪明,如果在撤消的上下文中调用 undoStack.Push,委托(delegate)将转而进入重做堆栈。)
我的麻烦是将 this.cashOnHand“缓存”到 coh 变量中有点烦人。我希望我可以这样写:
undo u = () => this.setCashOnHand(this.cashOnHand);
当然,这不会得到 cashOnHand 的当前值;它推迟查找值,直到委托(delegate)被调用,所以代码最终什么都不做。除了将值填充到像 coh 这样的局部变量中之外,有什么方法可以在构造委托(delegate)时“取消引用”cashOnHand?
我真的不想听更好的撤消方法。请将此视为关于委托(delegate)的一般性问题,仅使用撤消示例来使问题更清楚。
最佳答案
一般来说,除了您已经在做的事情之外,没有完美的解决方案。
但是,在您的特定情况下,您可以制作 currier ,像这样:
static Action Curry(Action<T> method, T param) { return () => method(param); }
你可以这样使用它:
Curry(setCashOnHand, this.cashOnHand);
如果你的方法接受其他参数,你可以这样使用它:
Curry(cashOnHand => setCashOnHand(3, cashOnHand), this.cashOnHand);
关于C# lambda 表达式 : How *Not* to Defer "Dereference"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2268584/
我是一名优秀的程序员,十分优秀!