C # में '=>' वाक्य रचना क्या है?


84

मैं इस मंच के कुछ प्रश्नों में सिर्फ इस वाक्य रचना के ऊपर आया था, लेकिन Google और कोई भी अन्य खोजकर्ता खोज में कुछ भी लेकिन अक्षरों और संख्या को अवरुद्ध करने के लिए जाता है, इसलिए "=>" की खोज करना असंभव है।

तो क्या कोई मुझे बता सकता है कि यह क्या है और इसका उपयोग कैसे किया जाता है?


जवाबों:


86

यह लंबोदर ऑपरेटर है।

C # 3 से C # 5 तक, यह केवल लैम्ब्डा अभिव्यक्तियों के लिए उपयोग किया गया था । ये मूल रूप से C # 2 में शुरू की गई गुमनाम विधियों का एक छोटा रूप है , लेकिन इसे अभिव्यक्ति पेड़ों में भी परिवर्तित किया जा सकता है ।

उदाहरण के तौर पे:

Func<Person, string> nameProjection = p => p.Name;

के बराबर है:

Func<Person, string> nameProjection = delegate (Person p) { return p.Name; };

दोनों ही मामलों में आप एक प्रतिनिधि के साथ एक प्रतिनिधि बना रहे हैं Person, उस व्यक्ति का नाम (एक स्ट्रिंग के रूप में) वापस कर रहे हैं।

C # 6 में एक ही वाक्यविन्यास का उपयोग अभिव्यक्ति-शारीरिक सदस्यों के लिए किया जाता है , जैसे

// Expression-bodied property
public int IsValid => name != null && id != -1;

// Expression-bodied method
public int GetHashCode() => id.GetHashCode();

यह सभी देखें:

(और वास्तव में इसी तरह के कई सवाल - लैम्ब्डा और लैम्ब्डा-एक्सप्रेशन टैग आज़माएं ।)


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

1
नाइस :) सिर्फ यहाँ आया क्योंकि इस प्रश्न को डुप्लिकेट क्लोजिंग के लिए एक लक्ष्य के रूप में इस्तेमाल किया गया था, इसलिए यह सोचा था कि उन अन्य मामलों में एक दूसरे के लिए शिकार पर जाने के बजाय 1 उत्तर देना अच्छा होगा :)
लास वी। कार्लसन

15

यह विधि संकेतन का अधिक संक्षिप्त रूप है। निम्नलिखित लगभग बराबर हैं:

// explicit method
int MyFunc(int pParam) {
   return pParam;
}

// anonymous (name-less) method
// note that the method is "wrapped" up in a hidden object (Delegate) this way
// so there is a very tiny bit of overhead compared to an explicit method
// (though it's really the assignment that causes that and would also happen
// if you assigned an explicit method to a reference)
Func<int, int> MyFunc = delegate (int pParam) { return pParam; };

// lambda expression (also anonymous)
// basically identical to anonymous method,
// except with everything inferred as much as possible, intended to be minimally verbose
Func<int, int> MyFunc = x => x;

// and => is now also used for "expression-bodied" methods
// which let you omit the return keyword and braces if you can evaluate
// to something in one line
int MyFunc(int pParam) =>
   pParam;

एक लंबोदर अभिव्यक्ति के रूप में सोचें, "कुछ दिया, कुछ लौटाओ"। ऊपर के उदाहरण में, लैम्ब्डा एक्सप्रेशन x => xकहता है "दिया एक्स, रिटर्न एक्स", हालांकि लैम्ब्डा एक्सप्रेशन के लिए जरूरी नहीं है कि वह कुछ लौटाए, जिस स्थिति में आप उन्हें "एक्स दिए गए एक्स के साथ कुछ करें" के रूप में पढ़ सकते हैं।

यह भी ध्यान दें कि "डेलिगेट" नामक तीन तरह की चीजें हैं जो पहली बार में बहुत भ्रमित हो सकती हैं।

एक अनाम विधि delegateकीवर्ड का उपयोग करती है , लेकिन बिना नाम के एक विधि को परिभाषित करती है:

Func<int, int> = delegate (int x) { return x; };

संदर्भ के लिए एक विधि (अनाम, स्पष्ट या लंबोदर) को निर्दिष्ट करने से एक छिपी हुई Delegateआवरण वस्तु बनती है जो कि विधि को संदर्भित करने की अनुमति देती है। (मूल रूप से "प्रबंधित फ़ंक्शन पॉइंटर" का एक प्रकार है।)

और फिर, आप कीवर्ड का उपयोग करते हुए विधि हस्ताक्षर भी घोषित कर सकते हैं delegate:

public delegate int TestFunc(int x, int y);

TestFunc myFunc = delegate (int x, int y) { return x + y; };

यह एक नामांकित हस्ताक्षर की घोषणा करता है TestFuncजो दो intएस लेता है और एक रिटर्न देता है int, और फिर उस प्रकार के एक प्रतिनिधि संदर्भ की घोषणा करता है जिसे फिर मिलान हस्ताक्षर के साथ एक अनाम तरीका सौंपा जाता है।


14

इसका अर्थ है अघोरता। उदाहरण के लिए

x => x + 1

एक ऐसी विधि का प्रतिनिधित्व करता है जो एक पैरामीटर के रूप में x लेता है और इसके उत्तराधिकारी को लौटाता है।

button.Click += new EventHandler((sender, e) => methodInfo.Invoke(null, new object[] { sender, e }));

एक MethodInfo के पास एक विधि लागू करके एक बटन को एक घटना हैंडलर प्रदान करता है।


10

यहाँ msdn से एक सरल उदाहरण है

delegate int del(int i);
del myDelegate = x => x * x;
int j = myDelegate(5); //j = 25

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


8

इसके बजाय अनाम विधि का उपयोग करने के बजाय:

somevar.Find(delegate(int n)
{
   if(n < 10)
      return n;
});

आप बस इसे इस तरह लिखते हैं:

somevar.Find(n => n < 10);

यह रिटर्न वैल्यू के आधार पर डेटा टाइप लेगा।


3

=> टोकन दो रूपों में समर्थित है: के रूप में लैम्ब्डा ऑपरेटर और एक के रूप में विभाजक एक सदस्य के नाम का और एक अभिव्यक्ति शरीर परिभाषा सदस्य कार्यान्वयन।

लंबोदर संचालक

लैम्ब्डा एक्सप्रेशंस में, लैम्ब्डा ऑपरेटर => लैम्बडा बॉडी से लेफ्ट साइड पर इनपुट वेरिएबल को राइट साइड में अलग करता है।

निम्न उदाहरण लैम्बडा एक्सप्रेशन के उपयोग को प्रदर्शित करने के लिए विधि सिंटैक्स के साथ LINQ फीचर का उपयोग करता है:

string[] words = { "bot", "apple", "apricot" };
int minimalLength = words
  .Where(w => w.StartsWith("a"))
  .Min(w => w.Length);
Console.WriteLine(minimalLength);   // output: 5

अभिव्यक्ति शरीर की परिभाषा

एक अभिव्यक्ति शरीर की परिभाषा में निम्नलिखित सामान्य वाक्यविन्यास हैं:

member => expression;

जहाँ अभिव्यक्ति एक मान्य अभिव्यक्ति है। ध्यान दें कि अभिव्यक्ति केवल एक बयान अभिव्यक्ति हो सकती है यदि सदस्य की वापसी का प्रकार शून्य है, या यदि सदस्य एक निर्माता, एक अंतिम रूप, या एक संपत्ति सेट एक्सेसर है।

निम्न उदाहरण एक व्यक्ति के लिए एक अभिव्यक्ति बॉडी डेफिनिशन दर्शाता है। स्ट्राइंग विधि:

public override string ToString() => $"{fname} {lname}".Trim();

यह निम्नलिखित विधि परिभाषा का एक छोटा संस्करण है:

public override string ToString()
{
   return $"{fname} {lname}".Trim();
}

4
यदि आप अन्य वेबसाइटों से उत्तर कॉपी और पेस्ट करने जा रहे हैं, तो कम से कम स्रोत का लिंक शामिल करें ।
कैलिस

1

यह मूल रूप से "पैरामीटर में" जाता है, एक पैरामीटर की तरह

MyObjectReference => MyObjectReference.DoSomething()

आमतौर पर आप फ़ंक्शंस को मापदंडों के रूप में या LINQ स्टेटमेंट्स में पास करने के लिए उपयोग करते हैं

MyCollection.Where(myobj => myobj.Age>10)

उदाहरण के लिए।


0

यह लंबोदर अभिव्यक्ति के वाक्य विन्यास का हिस्सा है। एक लंबोदर अभिव्यक्ति अनिवार्य रूप से एक प्रतिनिधि या एक अनाम विधि का छोटा रूप है। स्पष्ट करने के लिए, मान लें कि मेरे पास वर्णमाला के अक्षरों से मेल खाते तार की एक सरणी है। मैं उस सरणी के सदस्यों को चुन सकता हूं जिसमें निम्नलिखित LINQ अभिव्यक्ति के साथ "E" से अधिक मूल्य थे:

var someLetters = alphabet.Where (l => l> "E");

"=>" के बाईं ओर लंबोदर अभिव्यक्ति का हिस्सा परीक्षण के लिए चर नाम की पहचान करता है (जो वर्णमाला के व्यक्तिगत सदस्यों के लिए निर्धारित है) और "=>" पहचान के दाईं ओर लंबोदर अभिव्यक्ति का हिस्सा पहचानता है प्रसंस्करण। इस स्थिति में प्रसंस्करण एक बूलियन मान पैदा करता है, जहां तर्क यह निर्धारित करने के लिए उपयोग करता है कि वर्णमाला के प्रत्येक सदस्य को someLetters सरणी के माध्यम से पारित किया गया है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.