Sto tentando di implementare la funzionalità di annullamento con i delegati C#. Fondamentalmente, ho un UndoStack che mantiene un elenco di delegati che implementano ogni operazione di annullamento. Quando l'utente sceglie Modifica: Annulla, questo stack apre il primo delegato e lo esegue. Ogni operazione è responsabile di spingere un delegato di annullamento appropriato nello stack. Quindi supponiamo di avere un metodo chiamato "SetCashOnHand". Ecco come si presenta:C# Lambdas: Come * Non * rimandare "Dereferenziazione"?
public void SetCashOnHand(int x) {
int coh = this.cashOnHand;
undo u =() => this.setCashOnHand(coh);
this.cashOnHand = x;
undoStack.Push(u);
}
Quindi questo metodo costruisce un delegato annullamento, fa l'operazione, e (ammesso che riesce) spinge il delegato annullamento sul UndoStack. (UndoStack è abbastanza intelligente che se undoStack.Push viene chiamato nel contesto di un annullamento, il delegato va invece sulla pila di ripetizione.)
Il mio problema è che è un po 'fastidioso "cache" this.cashOnHand nel variabile coh. Vorrei poter scrivere semplicemente questo:
undo u =() => this.setCashOnHand(this.cashOnHand);
Ma, naturalmente, che non sarà possibile ottenere l'attuale valore della cashOnHand ; rimanda a cercare il valore finché non viene chiamato il delegato, quindi il codice si conclude senza fare nulla. C'è un modo in cui posso "dereferenziare" cashOnHand quando costruisco il delegato, oltre a riempire il valore in una variabile locale come coh?
Non sono molto interessato a conoscere i modi migliori per annullare. Si prega di considerare questo come una domanda generica sui delegati, con Annulla solo l'esempio per rendere la domanda più chiara.
Suppongo che tu intenda _Edit_, Annulla. – SLaks
Oops, hai ragione. Ho risolto la domanda. –