2009-02-22 5 views
6

इस बयान में '=>' क्या दर्शाता है?क्या ऑपरेटर करता है '=>' सी # में क्या मतलब है?

del = new SomeDelegate(() => SomeAction()); 

क्या उपर्युक्त घोषणा इस जैसा ही है?

del = new SomeDelegate(this.SomeAction); 

धन्यवाद।

+0

आपको अपने प्रश्न के लिए एक और वर्णनात्मक शीर्षक का उपयोग करना चाहिए, जैसे "क्या करता है '=>' ऑपरेटर सी # में संकेत करता है?" "सी # प्रतिनिधि प्रश्न" के बजाय –

+0

धन्यवाद, मैं और अधिक वर्णनात्मक होने की कोशिश करूंगा। – Krakerjak

उत्तर

7

मूल रूप से यह एक गुमनाम समारोह, कि कोई पैरामीटर SomeAction कॉल लेता निर्दिष्ट करने है। तो हाँ, वे कार्यात्मक रूप से समकक्ष हैं। हालांकि बराबर नहीं है।

public void CallSomeAction() 
{ 
    this.SomeAction(); 
} 

आशा है कि मदद करता है:

del = new SomeDelegate(this.CallSomeAction); 

जहां CallSomeAction के रूप में परिभाषित किया गया है: लैम्ब्डा का उपयोग करने के लिए और अधिक के बराबर है!

+0

तो फिर '=>' लैम्ब्डा को दर्शाता है? एक दूसरे के ऊपर क्या फायदा होगा? – Krakerjak

+1

लाभ प्राथमिक रूप से संक्षेप में और पठनीयता में से एक है :) – mletterle

4

वे एक ही बात है लेकिन "() => ..." वाक्यविन्यास जिसे लैम्ब्डा अभिव्यक्ति कहा जाता है और जैसा कि एक अनाम कार्य के समान है। आप शायद प्रतिनिधि भाग को पूरी तरह से छोड़ सकते हैं और बस संकलक को आपके लिए प्रतिनिधि प्रकार का अनुमान लगाने दें।

del = this.SomeAction; 

किस प्रकार "डेल" को घेर लिया गया है इसके आधार पर।

संपादित

lambdas या अनाम तरीकों या सिर्फ शुरुआत के लिए एक नियमित विधि आप तरीकों कि प्रतिनिधि के लिए प्रतिनिधि के हस्ताक्षर नहीं था मैप करने के लिए सक्षम बनाता है का उपयोग करना।

उदाहरण के लिए, कहें कि आपके पास हस्ताक्षर बूल myDelegate (int, int) के साथ एक प्रतिनिधि है लेकिन आप हस्ताक्षर बूल myMethod (स्ट्रिंग, स्ट्रिंग) प्रतिनिधि के साथ एक विधि चाहते हैं। इसके बाद आप लैम्ब्डा अभिव्यक्ति का उपयोग कर सकते हैं ताकि आप इस तरह के एक छोटे वाक्यविन्यास के साथ इनलाइन कर सकें।

delegate bool myDelegate(int x, int y); 

// With lambdas... 
myDelegate del = (int a, int b) => myMethod(a.ToString(), b.ToString()); 

// With anonymous methods... 
myDelegate del2 = delegate(int a, int b) { return myMethod(a.ToString(), b.ToString()); }; 

// The good ol' way without lambdas or anonymous methods... 
myDelegate del3 = SomeDelegateHandler; 

... then write a method somewhere else ... 

// Handler method 
private bool SomeDelegateHandler(int a, int b) 
{ 
    return myMethod(a.ToString(), b.ToString()); 
} 

तो तुम lambdas और अनाम तरीकों सिर्फ एक छोटी/इनलाइन प्रतिनिधि को संभालने के लिए एक विधि बनाने का तरीका मूल रूप से कर रहे हैं देख सकते हैं। आपके मामले में आपको अतिरिक्त विधि बनाने की आवश्यकता नहीं हो सकती है। यह सिर्फ अगर प्रतिनिधि हस्ताक्षर अपने विधि हस्ताक्षर के रूप में एक ही है पर निर्भर करता है, और मेरे लिए, ऐसा लगता है यह है की तरह।

2

=>Lambda Operator है, लैम्ब्डा अभिव्यक्ति सी # 2.0 anonymous methods के विकास की तरह हैं।

आप एक बहुत समान तरीके से गुमनाम तरीके और लैम्ब्डा एक्सप्रेशन का उपयोग प्रतिनिधि उदाहरण बना करने के लिए कर सकते हैं:

Func<string,int> wordCount; 
wordCount = delegate (string text) { return text.Split().Length; }; 
Console.WriteLine (wordCount("Hello World")); 

का उपयोग लैम्ब्डा भाव:

Func<string,int> wordCount; 
wordCount = (string text) => { text.Split().Length; }; 
Console.WriteLine (wordCount("Hello World")); 
4

"=>" पढ़ा जा सकता है "चला जाता है करने के लिए "(source: Eric Lippert), और बस एक लैम्ब्डा अभिव्यक्ति में ऑपरेशन से तर्क (रों) अलग करती है। इस मामले में, एक लैम्ब्डा अधिक है।बेहतर उदाहरण होगा:

var subList = list.FindAll(item => item.Type == "Foo"); 

(सभी वस्तुओं को खोजने जहां आइटम के प्रकार फू है)

आदि में # 2.0 सी, यह भी लिखा जा सकता है:

var subList = list.FindAll(delegate(SomeType item) { 
    return item.Type == "Foo";}); 

और एक त्वरित है अभिव्यक्ति का तरीका एक "इनलाइन" प्रदान करता है, जबकि यह भी "बंद" समर्थन प्रदान करता है - यानी यह भी हो सकता है:

string itemType = ... 
var subList = list.FindAll(item => item.Type == itemType); 

("प्रतिनिधि" और लैम्ब्डा उपयोग के लिए दोनों)

class Searcher { 
    public string itemType; 
    public bool Find(SomeType item) {return item.Type == itemType;} 
} 
... 
Searcher searcher = new Searcher(); 
searcher.itemType = ... 
var subList = list.FindAll(searcher.Find); 

वास्तव में, यह बहुत-बहुत वास्तव में क्या संकलक हमारे लिए करता है: यह अन्यथा आइटम प्रकार में पारित करने के लिए एक प्रकार-definiton की आवश्यकता होगी। सबसे बड़ा अंतर यह है कि एक लैम्ब्डा भीExpression व्यक्त कर सकता है, उदाहरण के लिए LINQ के लिए।