मैं सी # प्रतिनिधियों के साथ पूर्ववत कार्यक्षमता को लागू करने की कोशिश कर रहा हूं। असल में, मुझे एक UndoStack मिला है जो प्रत्येक पूर्ववत ऑपरेशन को लागू करने वाले प्रतिनिधियों की एक सूची बनाए रखता है। जब उपयोगकर्ता संपादित करता है: पूर्ववत करें, यह स्टैक पहले प्रतिनिधि को बंद कर देता है और इसे चलाता है। प्रत्येक ऑपरेशन स्टैक पर उचित पूर्ववत प्रतिनिधि को धक्का देने के लिए ज़िम्मेदार है। तो मान लीजिए मेरे पास "SetCashOnHand" नामक एक विधि है। यह इस तरह दिखता है:सी # लैम्बडास: कैसे "नहीं * *" Dereference "को परिभाषित करने के लिए?
public void SetCashOnHand(int x) {
int coh = this.cashOnHand;
undo u =() => this.setCashOnHand(coh);
this.cashOnHand = x;
undoStack.Push(u);
}
तो इस विधि पूर्ववत प्रतिनिधि निर्माण, संचालन करता है, और (यह मानते हुए यह सफल होता है) UndoStack पर पूर्ववत प्रतिनिधि धकेलती है। (UndoStack इतना स्मार्ट है कि अगर पूर्ववत करने के लिए पूर्ववत करें। पुश को पूर्ववत के संदर्भ में बुलाया जाता है, तो प्रतिनिधि इसके बजाय रेडो स्टैक पर जाता है।)
मेरी समस्या यह है कि यह "कैश" करने के लिए थोड़ा परेशान है। CashOnHand में कोह चर काश मैं सिर्फ इस लिख सकते हैं:
undo u =() => this.setCashOnHand(this.cashOnHand);
लेकिन निश्चित है कि वर्तमान cashOnHand का मूल्य नहीं मिलेगा; जब तक प्रतिनिधि को बुलाया जाता है तब तक यह मूल्य को देखता है, इसलिए कोड कुछ भी नहीं कर रहा है। क्या कोई तरीका है कि मैं प्रतिनिधि को बनाते समय "dereference" cashOnHand कर सकता हूं, अन्य स्थानीय चर में मूल्य को भरने के अलावा कोह?
मैं पूर्ववत करने के बेहतर तरीकों के बारे में सुनने में वास्तव में रूचि नहीं रखता हूं। प्रतिनिधियों के बारे में एक सामान्य प्रश्न के रूप में इस बारे में सोचें, प्रश्न को और स्पष्ट करने के लिए केवल पूर्ववत उदाहरण के साथ।
मुझे लगता है कि आप _Edit_, पूर्ववत करें। – SLaks
ओह, आप सही हैं। मैंने सवाल तय कर लिया है। –