2012-03-09 33 views
13

मूल रूप से, क्या एकल-पंक्ति अभिव्यक्ति लैम्ब्डा और एक कथन लैम्ब्डा के बीच कोई अंतर है? उदाहरण के लिए निम्नलिखित कोड ले लो,:अभिव्यक्ति लैम्ब्डा बनाम स्टेटमेंट लैम्ब्डा

private delegate void MyDelegate(); 

protected static void Main() 
{ 
    MyDelegate myDelegate1 =() => Console.WriteLine("Test 1"); 
    MyDelegate myDelegate2 =() => { Console.WriteLine("Test 2"); }; 

    myDelegate1(); 
    myDelegate2(); 

    Console.ReadKey(); 
} 

मैं पहली बार यह चाहते हैं क्योंकि मैं बदसूरत होने के लिए कोष्ठक मिल जाए, वहाँ कुछ अलग दोनों के बीच (बहु लाइन बयानों के लिए कोष्ठक की आवश्यकता होती है के बारे में स्पष्ट भाग के अलावा) है ?

+2

हाँ, ब्रैकेट्स। – Oded

उत्तर

13

आपको बहुस्तरीय लैम्ब्डा के लिए कथन लैम्ब्डा की आवश्यकता है। इसके अलावा कथन लैम्बडास LINQ से SQL जैसे अभिव्यक्ति प्रदाताओं द्वारा समर्थित नहीं हैं। .NET 4.0 से पहले .NET Framework में कथन अभिव्यक्ति पेड़ के लिए समर्थन नहीं था। यह 4.0 में जोड़ा गया था, लेकिन जहां तक ​​मुझे पता है कि कोई प्रदाता इसका उपयोग नहीं करता है।

Action myDelegate1 =() => Console.WriteLine("Test 1"); 
Expression<Action> myExpression =() => { Console.WriteLine("Test 2") }; //compile error unless you remove the { } 
myDelegate1(); 
Action myDelegate2 = myExpression.Compile(); 
myDelegate2(); 

अन्यथा वे वही हैं।

7

दोनों समान हैं - पहला syntactic sugar दूसरा है और दोनों एक ही आईएल में संकलित होंगे।

3

नहीं, इस उदाहरण में कोई अंतर नहीं है। यदि लैम्ब्डा का शरीर केवल एक अभिव्यक्ति है, तो आप ब्रैकेट को छोड़ सकते हैं। हालांकि, एक बार लैम्ब्डा में एक से अधिक अभिव्यक्तियां होती हैं, जैसे:

MyDelegate myDelegate2 =() => { 
    Console.WriteLine("Test 2");      
    Console.WriteLine("Test 2"); 
}; 

ब्रैकेट अनिवार्य हैं।

1

Personnaly, मैं Lambda अभिव्यक्ति पसंद करते हैं। अभिव्यक्ति का एक मूल्य है जहां वक्तव्य नहीं है। बचाव के लिए

http://lambda-the-ultimate.org/node/1044

10

परावर्तक:

मुझे लगता है कि आप निम्न लिंक की मदद कर सकते हैं! डिस्सेबल कोड इस तरह दिखता है:

private static void Main(string[] args) 
{ 
    MyDelegate myDelegate1 = delegate { 
     Console.WriteLine("Test 1"); 
    }; 
    MyDelegate myDelegate2 = delegate { 
     Console.WriteLine("Test 2"); 
    }; 
    myDelegate1(); 
    myDelegate2(); 
    Console.ReadKey(); 
} 

तो नहीं, दोनों के बीच कोई वास्तविक अंतर नहीं है। खुश रहो।

2

यदि प्रतिनिधि एक मूल्य देता है, तो return कथन लैम्बडा में निम्नानुसार आवश्यक है।

 Func<int, int, bool> foo = (x, y) => { return x == y; }; 
     Func<int, int, bool> goo = (x, y) => x == y; 
+0

डाउनवॉटर शायद यह नहीं समझ पाएंगे कि वे क्या करते हैं। :-) –

0

ओपी उदाहरण के लिए एक ही है, लेकिन बाद सी # 6.0, आप एक ही अभिव्यक्ति सिंटैक्स का उपयोग करने की अनुमति एक वर्ग के भीतर सामान्य गैर लैम्ब्डा पद्धतियां निर्धारित करने के। उदाहरण के लिए:

public static double AreaOfTriangle(double itsbase, double itsheight) 
{ 
    return itsbase * itsheight/2; 
} 

ऊपर कोड स्निपेट लिखा जा सकता है केवल यदि विधि एक भी अभिव्यक्ति में तब्दील किया जा सकता है। संक्षेप में, इसे अभिव्यक्ति लैम्ब्डा वाक्यविन्यास का उपयोग किया जा सकता है, लेकिन कथन लैम्ब्डा वाक्यविन्यास नहीं है।

public static double 
       AreaOfTrianglex(double itsbase, double itsheight) => itsbase * itsheight/2; 
संबंधित मुद्दे