2012-05-10 17 views
25

मैंने सी # में उपयोग करने से पहले अन्य भाषाओं में लैम्ब्डा अभिव्यक्तियों का उपयोग किया है, और इसलिए Func<T, TResult>, के रूप में सरल लैम्ब्स के लिए _ का उपयोग करने की आदत में विशेष रूप से सरल लैम्ब्डा के लिए जहां शरीर केवल वापसी मूल्य का प्रतिनिधित्व करने वाला एक अभिव्यक्ति है (भविष्यवाणी, आदि ..)। हालांकि, सी # में अक्सर के बजाय x,y,z,i,j,k जैसे लैम्ब्डा अभिव्यक्तियों के लिए एकल अक्षरों का उपयोग किया जा रहा है। पत्र दृष्टिकोण मेरे लिए अजीब लगता है क्योंकि उन अक्षरों में पहले से ही सामान्य उपयोग में लूप चर के लिए एक और सामान्य अर्थ है। _ मेरी राय में पढ़ने के लिए अक्सर आसान है। क्या सिंगल लेटर स्टाइल वास्तव में सी # में लैम्बडास के लिए स्थापित शैली है?सी # शैली: Lambdas, _ => या x =>?

उदाहरण:

क्या मैं लेखन के लिए इस्तेमाल किया है:

var ages = people.Select(_ => _.Age); 

कर रहा हूँ क्या मैं बजाय लिखा जा रहा देख:

var ages = people.Select(x => x.Age); // choice of 'x' is not consistent 
+24

मैं एक अंडरस्कोर इस्तेमाल किया जा रहा कभी नहीं देखा है। –

+0

व्यक्तिगत रूप से मैं लैम्ब्डा पैरामीटर के लिए 'w' का उपयोग करता हूं, जब यह समझने में छोटा होता है कि मैं किस बारे में बात कर रहा हूं। Http://research.microsoft.com/en-us/um/cambridge/projects/comega/ – Blindy

+1

के अवशेष केवल यही लोग हैं जो terse से प्यार करते हैं, व्यक्तिगत रूप से मैं एक सार्थक नाम का उपयोग करता हूं। न तो एक्स और न ही सार्थक हैं। उम्र आपके उदाहरण में मेरी पसंद होगी। –

उत्तर

46

कई सी # डेवलपर्स _ का उपयोग संकेत मिलता है कि पैरामीटर पैरामीटर का उपयोग होने पर पैरामीटर का उपयोग नहीं किया जा रहा है और एक अक्षर या अन्य संक्षिप्त नाम नहीं है।

अन्य संसाधन:

+1

चार्ली फूल लेख के लिए अपवोट जो वैध _ उपयोग के आगमन को समझाता है। –

+1

मेरे उदाहरण बिल्कुल सही नहीं थे (मुझे उन उदाहरणों में पी या व्यक्ति का उपयोग करना चाहिए था)। सबसे पहले मैंने सोचा कि यह केवल उन मामलों पर लागू हो सकता है जहां _ का प्रकार सामान्य/अज्ञात था, लेकिन सभी मामलों में जहां _ का उपयोग किया जाता है, कम से कम कुछ इस प्रकार के बारे में जानना चाहिए जब तक आप ऑब्जेक्ट पर विधियों का उपयोग नहीं कर रहे हैं (इस मामले में आप ओबीजे या इसी तरह का उपयोग करेंगे), ताकि औचित्य उड़ न सके। यह चीजों को थोड़ा सा साफ़ करता है। –

+0

अप्रयुक्त पैराम के लिए '_' का उपयोग करने पर कभी विचार नहीं किया गया। अब मैं शायद हर जगह .. –

0

अपने लैम्ब्डा चर नामकरण के लिए कोई 'स्थापित' शैली नहीं है। हालांकि, अंडरस्कोर आमतौर पर किसी प्रकार का इंस्टेंस सदस्य चर का अर्थ है, जिसका अर्थ है कि आपकी शैली एक सामान्य परिवर्तनीय नाम की तुलना में अन्य नामकरण मानकों के साथ संघर्ष कर सकती है।

लंबी कहानी लघु - जो आपके लिए काम करता है।

5

या आप एक सार्थक नाम का उपयोग कर सकते हैं, उदा।

var ages = people.Select(person => person.Age); 
+0

आप सही हैं। मेरे उदाहरण व्यक्ति का उपयोग करना चाहिए था। –

22

यह एक परिवर्तनीय नाम है, इसलिए मैं इस विचार के साथ जाऊंगा कि नाम को उस जानकारी को व्यक्त करना चाहिए जिसे उसे व्यक्त करने की आवश्यकता है। _ क्या जानकारी देता है?

उसी अंत में, x क्या जानकारी देता है?

मैं इस रूप में अपने उदाहरण में लिख सकते हैं:

var ages = people.Select(p => p.Age); 

विचार मुझे लगता है कि कि p कम से कम पूरे बयान है कि यह एक people रिकॉर्ड है के संदर्भ में पता चलता है। आप इसे आगे भी ले सकता है:

var ages = people.Select(person => person.Age); 

अब कि पाठक क्या उस चर वास्तव में है के कारक हैं। बेशक, इस तरह के एक छोटे से बयान के लिए, एक तर्क किया जा सकता है कि यह अधिक है। मुझे ऐसा नहीं लगता है, लेकिन यह वरीयता का मामला है। (और न केवल आपकी वरीयता, बल्कि इस कोड का समर्थन करने वाले किसी भी व्यक्ति की वरीयता।)

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

+6

बेशक, छोड़ा गया पैरामीटर केस (कहें, एक अज्ञात ईवेंट हैंडलर के लिए) जहां आप लिख रहे हैं (_, __) => {notificationEventHandler();} वह है जहां मैं उपयोग (और समर्थन) जारी रखना जारी रखता हूं अंडरस्कोर-केवल नाम। –

+1

@TetsujinnoOni: बेशक।उस स्थिति में, चर एक गैर परिवर्तनीय है। केवल एकमात्र जानकारी को व्यक्त करने की आवश्यकता है "मैं कुछ भी नहीं हूं, मुझे उपयोग न करें।" – David

+0

मैं एक-पंक्ति, विधि-कॉल लैम्बडास के लिए '_ => _.method()' का उपयोग करता हूं, क्योंकि यह निर्देश के संज्ञानात्मक वजन को कम करता है। विशेष रूप से जेनिक्स का उपयोग करते समय, 'x => x.method()' लिखना 'बस "यह क्या है' x का विभाजन-दूसरा विचार जोड़ता है? क्या यह अंतरिक्ष में समन्वय है?"। पर विचार करें निम्नलिखित मामला: 'प्रारंभ (_ => _ Init()।);' जेनेरिक्स के साथ प्रयोग किया जाता है, इस मामले में अंडरस्कोर एक "बाईपास प्रतीक 'के रूप में काम करता है। यह अनावश्यकता से बचाता है, यह परिभाषित करता है कि तर्क का प्रकार स्पष्ट है और उपयोग से इनकार किया जा सकता है - जैसे कि 'var' का उपयोग करते समय एक प्रकार की घोषणा दोहराने से रोकने के लिए। – MaDDoX

0

एक कारण है कि आप इसे एक नाम दे सकते हैं नहीं है - क्योंकि कभी-कभी आप एक से अधिक आदानों है और उन्हें अलग करने की जरूरत है सकते हैं:

Func<int,int,int> product = (num1, num2) => (num1 * num2); // takes in two ints, and returns one int 
int x = product(2, 3); 
+0

सच है, लेकिन मुझे नहीं लगता कि सवाल यही था। –

+0

फिर आप असली बुरा हो सकते हैं! (_, __) => (_ * __); संपादित करें: के, तो स्वाभाविक रूप से इटालिक मार्कर के रूप में मेरे अंडरस्कोर ले गए। बस एकाधिक इनपुट के लिए डबल-अंडरस्कोर (या अधिक) का उपयोग करने के लिए दिखा रहा है। –

+1

@ क्रिससिनक्लेयर, यदि आप अपनी अभिव्यक्ति के चारों ओर बैकटिक्स डालते हैं तो उन विशेष पात्रों को प्रदर्शित किया जाएगा। –

17

एक लैम्ब्डा समारोह किसी भी अन्य विधि से इतना अलग कैसे है। किसी को इस तरह के रूप में एक विधि के साथ कोड पोस्ट करने के लिए थे, तो:

public static int getAge(Person _) 
{ 
    return _.Age; 
} 

या

public static int getAge(Person x) 
{ 
    return x.Age; 
} 

आप क्या कहेंगे?

मेरी राय में लैम्बडा के लिए पैरामीटर का नाम चुनना किसी भी अन्य विधि के पैरामीटर के रूप में सार्थक होना चाहिए। मैं एक पहचान फ़ंक्शन x => x के लिए कभी-कभी अपवाद कर सकता हूं क्योंकि उस स्थिति में परिवर्तनीय को कुछ भी मतलब नहीं है, यह वास्तव में कुछ भी हो सकता है, लेकिन अंडरस्कोर या मेरे दिमाग में सबकुछ के लिए एक ही अक्षर का उपयोग करके कोड बहुत कम हो जाता है पठनीय। (इतने सारे लोगों को किया जा रहा है पठनीयता है, जो यदि आप सभी चर अंधेरा हार जाता है के रूप में LINQ/lambdas के फायदे टाउट।)

+1

अच्छी परिप्रेक्ष्य शिफ्ट के लिए उपरोक्त – hspain

+0

@TetsujinnoOni यदि आपने किसी को एक विधि 'सार्वजनिक int getAge (व्यक्ति पी) {वापसी पी.एजे;}' लिखा है, तो आप क्या कहेंगे? मुझे पता है कि मैंने किसी को लिखा है कि मैं कहूंगा कि "आपको एक और अर्थपूर्ण चर का उपयोग करना चाहिए और संक्षेप में नहीं।" मुझे कोई कारण नहीं दिखता कि एक ही तर्क लैम्बडा के बराबर लागू नहीं होता है। – Servy

+1

सरल भविष्यवाणियों के लिए, विवाद यह है कि एक सार्थक परिवर्तनीय नाम क्या हो रहा है obfuscates। आपके द्वारा लिखे गए दोनों मामलों में, विधि परिभाषा का औपचारिकता शोर की मात्रा को बढ़ाता है जिससे सिग्नल को अलग किया जाना चाहिए, इसलिए परिवर्तनीय नामकरण की लागत में वृद्धि हुई है। –

1

सी # में, _ वर्ग (विशेषता) चर के लिए प्रयोग किया जाता है और _ स्थानीय चर के लिए इस्तेमाल नहीं कर रहा है। तो स्थानीय चर और वर्ग चर के लिए सार्थक नाम का उपयोग करना अच्छा है।

पूर्व:

var personList = (from person in people where person.Age > 18 select person).ToList(); 
संबंधित मुद्दे