लैम्ब्डा एक्सप्रेशन एक अनाम मेथड को दर्शाने का एक बेहतर तरीका है। दोनों अनाम मेथड्स और लैम्ब्डा एक्सप्रेशन्स आपको मेथड कार्यान्वयन को इंलाइन परिभाषित करने की अनुमति देते हैं, हालांकि, एक अनाम मेथड के लिए आपको मेथड के लिए पैरामीटर प्रकार और रिटर्न प्रकार को स्पष्ट रूप से परिभाषित करने की आवश्यकता होती है।
लैम्ब्डा एक्सप्रेशन सिंटैक्स
- एक्सप्रेशन लैम्ब्डा: एक्सप्रेशन को बॉडी के रूप में रखता है:
(input-parameters) => expression - स्टेटमेंट लैम्ब्डा: स्टेटमेंट ब्लॉक को बॉडी के रूप में रखता है:
(input-parameters) => {}
बुनियादी उदाहरण
static void Main(string[] args)
{
// Func<int, int> - int लेता है, int लौटाता है
Func<int, int> square = x => x * x;
Console.WriteLine(square(5)); // 25
// Action - कोई रिटर्न नहीं
Action line = () => Console.WriteLine();
// Func<double, double>
Func<double, double> cube = x => x * x * x;
// बहु-पैरामीटर
Func<int, int, bool> testForEquality = (x, y) => x == y;
// स्पष्ट प्रकार के साथ
Func<int, string, bool> isTooLong = (int x, string s) => s.Length > x;
Console.ReadLine();
}
टपल्स के साथ लैम्ब्डा (C# 7.0+)
// टपल आर्गुमेंट
Func<(int X, int Y), double> distance = p => Math.Sqrt(p.X * p.X + p.Y * p.Y);
Console.WriteLine(distance((3, 4))); // 5
// टपल रिटर्न
Func<int, (int Square, int Cube)> powers = x => (x * x, x * x * x);
var (sq, cb) = powers(3); // sq=9, cb=27
लैम्ब्डा एक्सप्रेशन नियम
- लैम्ब्डा एक्सप्रेशन के भीतर पेश किए गए वेरिएबल्स एनक्लोजिंग मेथड में विजिबल नहीं हैं
- लैम्ब्डा एक्सप्रेशन एनक्लोजिंग मेथड से
in,ref, याoutपैरामीटर को सीधे कैप्चर नहीं कर सकता - लैम्ब्डा एक्सप्रेशन में
returnस्टेटमेंट एनक्लोजिंग मेथड को रिटर्न नहीं कराता - लैम्ब्डा एक्सप्रेशन में
goto,break, याcontinueस्टेटमेंट नहीं हो सकते यदि टारगेट लैम्ब्डा ब्लॉक के बाहर है - लैम्ब्डा एक्सप्रेशन ब्लॉक के बाहर जंप स्टेटमेंट होना भी एरर है यदि टारगेट ब्लॉक के अंदर है
लैम्ब्डा बनाम अनाम मेथड्स
| विशेषता | लैम्ब्डा एक्सप्रेशन | अनाम मेथड (C# 2.0) |
|---|---|---|
| सिंटैक्स | x => x * x | delegate(int x) { return x * x; } |
| प्रकार अनुमान | हाँ | नहीं (स्पष्ट प्रकार आवश्यक) |
| पठनीयता | उच्च | कम |
| पैरामीटर प्रकार | निहित | स्पष्ट |
व्यावहारिक उपयोग के मामले
LINQ क्वेरीज
var numbers = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
var evens = numbers.Where(n => n % 2 == 0);
var squares = numbers.Select(n => n * n);
var sum = numbers.Where(n => n > 5).Sum();
इवेंट हैंडलर्स
button.Click += (sender, e) => MessageBox.Show("Clicked!");
timer.Elapsed += (s, e) => Console.WriteLine($"Tick at {e.SignalTime}");
टास्क फैक्टरी
Task.Run(() => DoWork());
Task.Factory.StartNew(() => ProcessData());
क्लोजर (वेरिएबल कैप्चर)
int factor = 2;
Func<int, int> multiply = x => x * factor; // factor कैप्चर करता है
factor = 3;
Console.WriteLine(multiply(5)); // 15 (नया factor मान उपयोग करता है!)
लैम्ब्डा को डेलीगेट में परिवर्तित करना
कोई भी लैम्ब्डा एक्सप्रेशन एक डेलीगेट प्रकार में परिवर्तित किया जा सकता है। डेलीगेट प्रकार जिसे एक लैम्ब्डा एक्सप्रेशन में परिवर्तित किया जा सकता है, उसके पैरामीटर्स और रिटर्न वैल्यू के प्रकारों द्वारा परिभाषित किया जाता है।
- यदि लैम्ब्डा एक्सप्रेशन कोई मान नहीं लौटाता, तो इसे
Actionडेलीगेट प्रकारों में से एक में परिवर्तित किया जा सकता है - अन्यथा, इसे
Funcडेलीगेट प्रकारों में से एक में परिवर्तित किया जा सकता है
सारांश
लैम्ब्डा एक्सप्रेशन्स अनाम फंक्शन्स लिखने के लिए संक्षिप्त, टाइप-सेफ तरीका प्रदान करते हैं। वे LINQ, इवेंट हैंडलिंग, एसिंक्रोनस प्रोग्रामिंग और फंक्शनल प्रोग्रामिंग पैटर्न में बड़े पैमाने पर उपयोग किए जाते हैं।