यदि आप सी प्रोग्रामर हैं, तो प्रतिनिधियों को फ़ंक्शन के पॉइंटर्स के रूप में माना जा सकता है। हालांकि, सी # में प्रतिनिधि एक साधारण फ़ंक्शन पॉइंटर से कहीं अधिक हैं। यह लेख प्रतिनिधियों की अवधारणा और दिन-प्रतिदिन की प्रोग्रामिंग में उनके उपयोग की व्याख्या करता है।
अनिवार्य रूप से, प्रतिनिधि अप्रत्यक्ष स्तर प्रदान करते हैं। वे कोड के एक टुकड़े को इनकैप्सुलेट करते हैं जिसे पास किया जा सकता है और टाइप-सुरक्षित तरीके से निष्पादित किया जा सकता है। व्यवहार को तुरंत निष्पादित करने के बजाय, यह किसी वस्तु में समाहित है। आप उस ऑब्जेक्ट पर कई कार्य कर सकते हैं, और उनमें से एक उस निहित व्यवहार को क्रियान्वित कर रहा है।
प्रतिनिधियों का उपयोग हमें उच्च-क्रम के कार्यों को लिखने की अनुमति देता है, अर्थात ऐसे कार्य जो पैरामीटर के रूप में फ़ंक्शन प्राप्त कर सकते हैं या रिटर्न मान के रूप में फ़ंक्शन लौटा सकते हैं। एक प्रतिनिधि प्रकार विधि हस्ताक्षर को परिभाषित करता है जिसे प्रतिनिधि प्रतिनिधित्व कर सकता है, विशेष रूप से विधि का रिटर्न प्रकार और इसके पैरामीटर प्रकार। निम्नलिखित उदाहरण में, ट्रांसफॉर्मर एक प्रतिनिधि है जो किसी भी विधि का प्रतिनिधित्व कर सकता है जो एक पूर्णांक स्वीकार करता है और देता है।
delegate int Transformer(int x);
हम किसी भी तरीके (लैम्बडास, इंस्टेंस, या स्टैटिक मेथड्स सहित) को ट्रांसफॉर्मर के इंस्टेंस के लिए असाइन कर सकते हैं जो सिग्नेचर को पूरा करता है। उदाहरण के लिए -
Transformer square = x => x * x; Transformer cube = x => x * x * x; Console.WriteLine(square(3)); // prints 9 Console.WriteLine(cube(5)); // prints 125
प्रतिनिधियों का उपयोग कब करें?
प्रतिनिधि आमतौर पर तब उपयोग किए जाते हैं जब कोड जो कुछ क्रियाओं को निष्पादित करना चाहता है, उन क्रियाओं के विवरण को नहीं जानता है, लेकिन उन क्रियाओं के इंटरफ़ेस को जानता है।
प्रोग्रामिंग में, हमें अक्सर ऐसी परिस्थितियों का सामना करना पड़ता है जहां हमें किसी विशेष क्रिया को निष्पादित करने की आवश्यकता होती है, लेकिन हम पहले से नहीं जानते कि हम इसे निष्पादित करने के लिए किस विधि को कॉल करना चाहते हैं। प्रतिनिधि उस व्यवहार को एक प्रतिनिधि के साथ बदलकर और फिर संदर्भ और स्थिति के अनुसार उपयुक्त व्यवहार के साथ उस प्रतिनिधि के एक ठोस उदाहरण को पारित करके इस समस्या को हल करने में हमारी सहायता करते हैं।
एक प्रतिनिधि को कुछ भी करने के लिए, चार चीजों का होना जरूरी है -
1) प्रतिनिधि प्रकार को घोषित करने की आवश्यकता है।
एक प्रतिनिधि प्रकार अनिवार्य रूप से उस फ़ंक्शन की परिभाषा है जिसका वह प्रतिनिधित्व कर रहा है, यानी इसमें पैरामीटर प्रकार होते हैं जो फ़ंक्शन स्वीकार करेगा और एक वापसी प्रकार जो इसे लौटाता है।
उदाहरण के लिए, एक प्रतिनिधि प्रकार जो एक विधि का प्रतिनिधित्व करता है जो दो संख्याओं को इनपुट के रूप में लेता है और एक संख्या देता है, जिसे -
के रूप में घोषित किया जा सकता हैdelegate int Processor(int numOne, int numTwo);
प्रोसेसर एक प्रकार है, जो एक वर्ग द्वारा बनाए गए प्रकार के समान है। इस प्रकार का एक उदाहरण बनाने के लिए, आपको एक ऐसी विधि की आवश्यकता होती है जो इनपुट के रूप में दो नंबर लेती है और एक बूल लौटाती है।
2) निष्पादित किया जाने वाला कोड एक विधि में होना चाहिए।
एक ऐसी विधि को परिभाषित करें जिसमें उपरोक्त प्रतिनिधि प्रकार के समान सटीक हस्ताक्षर हों और जो आप रनटाइम की स्थिति के अनुसार चाहते हैं। उदाहरण के लिए, निम्न में से किसी भी तरीके का उपयोग प्रोसेसर का इंस्टेंस बनाने के लिए किया जा सकता है, क्योंकि वे सभी दो नंबर लेते हैं और एक नंबर लौटाते हैं।
static int Add(int numOne, int numTwo){ Return numOne + numTwo; } static int Subtract(int numOne, int numTwo){ Return numOne - numTwo; }
3) एक प्रतिनिधि उदाहरण बनाया जाना चाहिए।
अब जब आपके पास एक प्रतिनिधि प्रकार और सही हस्ताक्षर वाला एक तरीका है, तो आप उस प्रतिनिधि प्रकार का एक उदाहरण बना सकते हैं। ऐसा करने में, हम अनिवार्य रूप से सी # कंपाइलर को इस विधि को निष्पादित करने के लिए कह रहे हैं जब प्रतिनिधि उदाहरण लागू किया जाता है।
Processor processorOne = new Processor(Add); Processor processorTwo = new Processor(Subtract);
उपरोक्त उदाहरण मानता है कि जोड़ें और घटाव विधियों को उसी वर्ग में परिभाषित किया गया है जहां हम प्रतिनिधि का उदाहरण बना रहे हैं। यदि विधियों को किसी भिन्न वर्ग में परिभाषित किया गया है, तो हमें उस वर्ग के उदाहरण की आवश्यकता होगी।
4) डेलिगेट इंस्टेंस को लागू किया जाना चाहिए।
यह केवल प्रतिनिधि उदाहरण पर एक विधि को कॉल करने का मामला है, जिसका नाम है, आश्चर्य की बात नहीं है, आह्वान करें। प्रतिनिधि उदाहरण पर इस विधि में पैरामीटर और वापसी प्रकार की एक ही सूची है जो प्रतिनिधि प्रकार की घोषणा निर्दिष्ट करती है। कॉलिंग आमंत्रण प्रतिनिधि उदाहरण की कार्रवाई निष्पादित करेगा।
int sum = processorOne.Invoke(3, 5);
हालाँकि, C# इसे और भी आसान बनाता है। आप सीधे प्रतिनिधि उदाहरण का आह्वान कर सकते हैं जैसे कि यह स्वयं में एक विधि थी। उदाहरण के लिए,
int difference = processorTwo(10, 6);
प्रतिनिधियों को जोड़ना और हटाना
यदि हम एक प्रतिनिधि उदाहरण के एकल आमंत्रण के साथ विभिन्न क्रियाओं की सूची निष्पादित करना चाहते हैं, तो सी # हमें ऐसा करने की अनुमति देता है। प्रणाली। प्रतिनिधि प्रकार में दो स्थिर विधियाँ होती हैं, जिन्हें कंबाइन और रिमूव कहा जाता है।
<एच3>1. संयोजित करेंएक आमंत्रण सूची के साथ एक नया प्रतिनिधि बनाता है जो पैरामीटर के रूप में पारित प्रतिनिधियों की आमंत्रण सूची को जोड़ता है। जब नया प्रतिनिधि उदाहरण लागू किया जाता है, तो उसके सभी कार्यों को क्रम में निष्पादित किया जाता है।
public static Delegate Combine(params Delegate[] delegates); // OR public static Delegate Combine(Delegate a, Delegate b);
यदि आमंत्रण सूची में कोई भी क्रिया एक अपवाद फेंकती है, जो बाद की किसी भी क्रिया को निष्पादित होने से रोकती है।
<एच3>2. हटाएंकिसी अन्य प्रतिनिधि की आमंत्रण सूची से एक प्रतिनिधि की आमंत्रण सूची की अंतिम घटना को हटा देता है। स्रोत की आमंत्रण सूची लेकर और मूल्य की आमंत्रण सूची की अंतिम घटना को हटाकर बनाई गई आमंत्रण सूची के साथ एक नया प्रतिनिधि लौटाता है।
public static Delegate Remove(Delegate source, Delegate value);
सारांश
-
प्रतिनिधि एकल-विधि इंटरफ़ेस के समान एक विशेष प्रकार और पैरामीटर के सेट के साथ व्यवहार को समाहित करते हैं।
-
एक प्रतिनिधि प्रकार की घोषणा द्वारा वर्णित प्रकार के हस्ताक्षर यह निर्धारित करते हैं कि प्रतिनिधि उदाहरण बनाने के लिए कौन से तरीकों का उपयोग किया जा सकता है और हस्ताक्षर के लिए हस्ताक्षर किया जा सकता है।
-
एक प्रतिनिधि उदाहरण बनाने के लिए एक विधि की आवश्यकता होती है जिसे हम प्रतिनिधि के आह्वान पर निष्पादित करना चाहते हैं।
-
प्रतिनिधि उदाहरण स्ट्रिंग के समान अपरिवर्तनीय हैं।
-
प्रतिनिधि उदाहरणों में प्रत्येक में एक आमंत्रण सूची होती है - क्रियाओं की एक सूची।
-
प्रतिनिधि उदाहरणों को एक दूसरे के साथ जोड़ा और हटाया जा सकता है।
उदाहरण
using System; class Program{ delegate int Transformer(int x); delegate int Processor(int numOne, int numTwo); static void Main(){ Transformer square = x => x * x; Transformer cube = x => x * x * x; Console.WriteLine(square(3)); // prints 9 Console.WriteLine(cube(5)); // prints 125 Processor processorOne = new Processor(Add); Processor processorTwo = new Processor(Subtract); int sum = processorOne.Invoke(3, 5); Console.WriteLine(sum); // prints 8 int difference = processorTwo(10, 6); Console.WriteLine(difference); // prints 4 } static int Add(int numOne, int numTwo){ return numOne + numTwo; } static int Subtract(int numOne, int numTwo){ return numOne - numTwo; } }
आउटपुट
9 125 8 4