2012-09-21 3 views
5

में हैं मैं इस तरह कुछ कोड देखें:क्या "एस" और "ई" सी # कोड वाक्य रचना

textBox.TextChanged += (s, e) => this.Foo(); 

लेकिन मैं नहीं जानता कि "एस" और "ई" कर रहे हैं क्या? कोड की इस पंक्ति के लिए मुझे सी # में क्या विषय पढ़ना चाहिए?

+0

बस एक चर स्रोत और EventArgs –

+0

बस दिए गए उत्तर में जोड़ने के लिए के लिए नाम कर सकते हैं को देखते हुए, कारण प्रकार पहचानकर्ता के बिना वे अपने दम पर खड़े हैं है क्योंकि कंपाइलर इवेंट हैंडलर से अपने उपयोग का अनुमान लगा सकता है, इसलिए यह स्पष्ट रूप से राज्य (ऑब्जेक्ट प्रेषक, टेक्स्ट चेंजएडएन्ट आर्ट्स ई) '(सुनिश्चित नहीं है कि, अनुमान लगाने पर, 0 अनुमान नहीं है) –

उत्तर

14

वे लैम्ब्डा-समारोह के मापदंडों हैं। इस अंकन में

textBox.TextChanged += (object s, EventArgs e) => { this.Foo(); }; 

यह आसान है कि वे विधि मानकों को देखने के लिए:

संकलक संदर्भ से उनके प्रकार infers, लेकिन यह एक लंबे समय तक (अधिक सूचनात्मक) प्रपत्र लिखने की अनुमति दी है।
=> के दूसरी तरफ विधि निकाय है।


जवाब में टिप्पणी करने के लिए:

अब वहाँ एक रास्ता भी एक ही लैम्ब्डा अभिव्यक्ति एक सरल सी # वाक्य रचना में मैं फिर से लिखने के लिए है?

हां, आप हमेशा क्लासिक नोटेशन का उपयोग कर सकते हैं। और जब यह 'बेहतर' या यहां तक ​​कि 'सरल' नहीं हो सकता है, तो यह समझना आसान होता है कि आप इसे कब सीख रहे हैं।

// The setup method 
void MyMethod() 
{ 
    //textBox.TextChanged += new Eventhandler(MyTextChangedHandler); // C#1 and later 
    textBox.TextChanged += MyTextChangedHandler;      // C#2 and later 
} 

// The subscribed method. The lambda is an inline version of this. 
private void MyTextChangedHandler(object s, EventArgs e) 
{ 
    this.Foo(); 
} 
+0

धन्यवाद, इसलिए मेरे लिए Google का कीवर्ड सीखना है "लैम्ब्डा अभिव्यक्ति" ... अब एक सरल लैम्बडा अभिव्यक्ति को फिर से लिखने का एक तरीका है जो मेरे पास एक सरल सी # syn में है कर? Lambda अभिव्यक्ति के बिना अच्छी तरह से। – Bohn

+0

@BDotA "सरल" व्यक्तिपरक है। ज्यादातर लोग लैम्बास को ऐसा करने का सबसे आसान तरीका मानते हैं। – Servy

+0

@ सर्वी - हाँ, लेकिन जब यह सीखते हैं तो कुछ समय के लिए इवेंटहाउसर्स और लैम्बडा को अलग करना आसान होता है। BdotA: संपादन देखें। –

4

s स्रोत ऑब्जेक्ट है और e उद्देश्य यह है कि EventArgs वस्तु या EventArgs वर्ग से बढ़ाया जाना चाहिए, आप को पढ़ने के लिए lambda expression

1

जो विषय आप खोज रहे हैं उसे expression lambdas कहा जाता है।

s और e अज्ञात फ़ंक्शन के पैरामीटर के नाम हैं जिनके शरीर को => के बाद इंगित किया गया है।

2

एक लैम्डा अभिव्यक्ति एक प्रतिनिधि के लिए शॉर्टकट के रूप में उपयोग की जाती है। टेक्स्टकांडेड उम्मीद करता है कि एक प्रतिनिधि दो तर्क लेता है, object sender, EventArgs e। लैम्ब्डा संस्करण इन तर्कों को प्लेसहोल्डर्स के साथ चिह्नित करता है, जो s=sender, e=eventargs है।

textBox.TextChanged += new EventHandler(delegate (Object s, EventArgs e) { 

      }); 
+0

ठीक है, अब यह पुराना वाक्यविन्यास है ... अब मैं समझ सकता हूं कि लैम्बडा चीज क्या बिल्ली थी। – Bohn

+1

@BDotA हां, एक और सिंटेटिक तरीका है (और पढ़ने के लिए आसान है, बस इसे उपयोग करने की आवश्यकता है) –

1

एस आमतौर पर इस (उद्देश्य यह है कि घटना लागू) और ई घटना तर्क हो जाएगा होने जा रहा है: के बाद से दृश्य के पीछे यह करने के लिए धर्मान्तरित सिर्फ एक वाक्यात्मक चीनी है। इस stackoverflow जवाब यह व्याख्या करनी चाहिए: विधि के

Weak event handler model for use with lambdas

1

मानकों। उदाहरण के लिए:

protected void TextBox_TextChanged(Object Sender, EventArgs Args) 
1

यह एक लैम्ब्डा अभिव्यक्ति है। एक लैम्ब्डा अभिव्यक्ति एक विधि लिखने का एक संक्षिप्त तरीका है (या सटीक होने के लिए एक प्रतिनिधि)।आप इस

private void TextBox_TextChanged(object sender, EventArgs e) 
{ 
    this.Foo(); 
} 

की तरह एक विधि लिख सकता है और फिर इस

textBox.TextChanged += TextBox_TextChanged; 

तरह हैंडलर जोड़ने

textBox.TextChanged += (s, e) => this.Foo(); 

करने के लिए इसे बराबर होगा तुम भी लिख सकता है

textBox.TextChanged += (object s, EventArgs e) => this.Foo(); 

लेकिन argu के प्रकार सेंट्स को सी # कंपाइलर द्वारा स्वचालित रूप से अनुमानित किया जाता है। s और e पैरामीटर हैं और TextBox_TextChanged विधि के पैरामीटर के बराबर हैं: object sender, EventArgs e। उन्हें => के बाद अभिव्यक्ति में उपयोग किया जा सकता है।

textBox.TextChanged += (s, e) => this.Foo(s, e); 

(यह मानते हुए फू एक इसी पैरामीटर सूची है) इन मानकों के नाम कोई फर्क नहीं पड़ता।


अद्यतन:

आवश्यक विधि (या प्रतिनिधि) एक वापसी मान की आवश्यकता है, तो आप लैम्ब्डा अभिव्यक्ति में return कीवर्ड छोड़ सकते हैं। इस विधि

public void WriteValues(Func<double, double> f) 
{ 
    for (int i = 0; i <= 10; i++) { 
     Console.WriteLine("f({0}) = {1}", i, f(i)); 
    } 
} 

आप इन कॉल

WriteValues(x => x * x); 
WriteValues(x => Math.Sin(x)); 
WriteValues(t => Math.Exp(-t)); 
संबंधित मुद्दे