_ => लैंसडा अभिव्यक्ति में इस अंडरस्कोर का क्या अर्थ है?


111

एक लंबोदर अभिव्यक्ति का क्या _=> exprमतलब है?

_लैम्ब्डा के इनपुट के रूप में क्या उद्देश्य है ?

उदाहरण:

int count = 0;
list.ForEach(_ => count += 1);

8
नमस्ते और StackOverflow में आपका स्वागत है। उपयोगी उत्तर प्राप्त करने के आपके अवसर को बढ़ाने के लिए मैंने आपके प्रश्न को थोड़ा संपादित करने की स्वतंत्रता ली, आशा है कि आपको कोई आपत्ति नहीं है।
लास वी। कार्लसन

ध्यान दें कि, मान listलेना एक है IEnumerable<T>, वे (और चाहिए) बस इस्तेमाल किया हैsum = list.Count();
BlueRaja - Danny Pflughoeft

मुझे लगता है कि इसे रोकने के लिए इस्तेमाल किया जा सकता है कि आप एक नए चर नाम के साथ गुंजाइश को "प्रदूषित" करें जिसका उपयोग कहीं और किया जा सकता है जो एक संघर्ष का कारण होगा।
टिम श्मेल्टर

जवाबों:


84

जब आप पैरामीटर के बारे में परवाह नहीं करते हैं तो यह एक सम्मेलन है।


3
यह हास्केल और अन्य कार्यात्मक भाषाओं में अधिक सामान्य है। मुझे लगता है कि यह कहां से आता है।
गाबे मुथरत

10
हास्केल, एमएल, स्काला और अन्य में, _पैटर्न मिलान में वाइल्डकार्ड चरित्र है। इसका मूल रूप से मतलब है "मुझे परवाह नहीं है, मैं हमेशा चाहता हूं कि यह मैच हो"। यह "मुझे परवाह नहीं है" तब किया जाता है जब यह उन चीजों का नामकरण करता है जिन्हें आप परवाह नहीं करते हैं और वहां से यह अन्य प्रोग्रामिंग भाषाओं में फैल जाता है। उदाहरण के लिए, रूबी में भी इसका उपयोग उसी चीज़ के रूप में किया जाता है, उदाहरण के लिए, हालांकि रूबी में इसका _कोई विशेष महत्व नहीं है।
जॉर्ग डब्ल्यू मित्तग

@ JörgWMittag मई 2010 में सही है, लेकिन जून 2010 तक नहीं। बहुत बढ़िया समय! :) stackoverflow.com/q/6397078/38765
एंड्रयू ग्रिम

38

यह एक पैरामीटर नाम है, यद्यपि यह एक उपयोगी नहीं है, लेकिन यह आमतौर पर उपयोग किया जाता है (कुछ सम्मेलनों द्वारा) जब आपको यह निर्दिष्ट करने की आवश्यकता होती है कि कोड को संकलित करने के लिए अभिव्यक्ति का एक पैरामीटर है, लेकिन आप वास्तव में परवाह नहीं करते हैं इसके बारे में, इसलिए आप इसे अनदेखा करने जा रहे हैं।

यह मूल रूप से सिंटैक्स का शोषण कर रहा है कि C # में एक कानूनी पहचानकर्ता क्या है, और चूंकि एक पहचानकर्ता अंडरस्कोर के साथ शुरू हो सकता है, और इसमें कुछ और नहीं है, यह सिर्फ एक पैरामीटर नाम है।

आप आसानी से लिख सकते हैं:

var _ = 10;

1
_ के बजाय, क्या हम () का उपयोग कर सकते हैं?
अमेश

2
क्या आपने उसका उपयोग करने की कोशिश की?
लेज़स वी। कार्लसन

हां, मैंने इसका इस्तेमाल तब किया था जब मैं लैंबडा एक्सप्रेशन का उपयोग करके एक थ्रेड बना रहा था। Thread t= new Thread(()=>doSomething(x,y)); t.start();
अमेश

मेरा मानना ​​है कि, _ का उपयोग संग्रह के प्रत्येक चर को लंबोदर अभिव्यक्ति तक पहुंचा रहा है, भले ही इसका उपयोग नहीं किया गया हो। लेकिन जब हम उपयोग करते हैं (तो) ऐसा नहीं हो सकता है। मेरा मतलब है कि पैरामीटर कम लंबोदा।
अमेश

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


10

क्योंकि लैम्डा अभिव्यक्ति का उपयोग ज्यादातर संक्षिप्त, अनाम कोड में किया जाता है, ताकि चर का नाम कभी-कभी शून्य न हो, यहां तक ​​कि वे कोड ब्लॉक में चर का उपयोग नहीं करते हैं, ताकि वे सिर्फ एक संक्षिप्त, सम्मेलन के लिए एक _ दें


7

मैं _ => _.method()एक-पंक्ति, विधि-कॉल लैम्ब्डा के लिए भी दूसरा उपयोग करता हूं , क्योंकि यह निर्देश के संज्ञानात्मक वजन को कम करता है। विशेष रूप से जेनेरिक, लेखन का उपयोग करते समयx => x.method() बस "व्हाट 'x?" क्या यह अंतरिक्ष में एक समन्वय है? "

निम्नलिखित मामले पर विचार करें:

Initialize<Client> ( _=>_.Init() );

जेनरिक कॉल के साथ प्रयोग किया जाता है, इस मामले में अंडरस्कोर "बाईपास प्रतीक" के रूप में काम करता है। यह अतिरेक से बचता है, यह परिभाषित करते हुए कि तर्क का प्रकार स्पष्ट है और उपयोग से इसका अनुमान लगाया जा सकता है - ठीक उसी तरह जब आप एक प्रकार की घोषणा को रोकने के लिए 'var' का उपयोग करते हैं। लिख रहे हैंclient=>client.Init()यहाँ बस किसी भी अर्थ को जोड़ने के बिना निर्देश को लंबा कर देगा।

जाहिर है, यह विधि को पारित करने के लिए लागू नहीं होता है, जिसे विवरणात्मक रूप से नामित किया जाना चाहिए। उदाहरण के लिए .:Do( id=>Log(id) );

विधि कॉल के लिए एकल-अंडरस्कोर-पैरामीटर उपयोग एक-लाइनर के बजाय कोड के एक ब्लॉक का उपयोग करते समय शायद ही उचित है, क्योंकि लैम्बडा पहचानकर्ता अपनी जेनरिक परिभाषा से डिस्कनेक्ट हो जाता है। सामान्य तौर पर जब समान पहचानकर्ता का पुन: उपयोग किया जाना है, तो इसे एक वर्णनात्मक नाम दें।

लब्बोलुआब यह है कि शब्दशः विस्मृति के लिए केवल उचित है, विशेष रूप से लैम्ब्डा के लिए, जो पहली बार में गुमनाम प्रतिनिधियों के निर्माण को सरल बनाने के लिए बनाए गए थे। किसी भी मामले में, सामान्य ज्ञान का उपयोग किया जाना चाहिए, जो कि सुगमता और सुगमता को संतुलित करता है। यदि प्रतीक वास्तविक कार्यक्षमता के लिए केवल "हुक" है, तो एक वर्ण पहचानकर्ता पूरी तरह से ठीक है। इंडेक्स के रूप में फॉर-लूप और "आई" और "जे" अक्षरों के साथ ऐसा ही है।


2
इस दृष्टिकोण के लिए +1! हालांकि मैं "संज्ञानात्मक वजन कम करने" के लिए लंबोदर में केवल अंडरस्कोर का उपयोग कर रहा था और यह दिखाने के लिए नहीं कि इस पैरामीटर का उपयोग नहीं किया गया है। यह अंडरस्कोर के साथ आसान पढ़ता है, खासकर यदि बहुत अधिक जंजीर है और आप तुरंत टाइप कर सकते हैं, जैसा कि अक्सर LINQ प्रश्नों के साथ होता है!
वरवारा कलिनािना

3
Do(id => Log(id))बेहतर रूप में संक्षिप्त है Do(Log)
अलुआन हद्दद
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.