डेलीगेट्स और इवेंट्स
C# में डेलीगेट्स और इवेंट्स अत्यंत महत्वपूर्ण अवधारणाएँ हैं जो सॉफ़्टवेयर विकास में लचीलापन और मॉड्यूलरिटी प्रदान करती हैं। डेलीगेट एक प्रकार-सुरक्षित मेथड पॉइंटर है जो मेथड्स को पैरामीटर के रूप में पास करने, उन्हें स्टोर करने और डायनामिकली कॉल करने की अनुमति देता है। इससे एप्लिकेशन आर्किटेक्चर में उच्च लचीलापन आता है। इवेंट्स डेलीगेट्स पर आधारित होते हैं और पब्लिशर-सब्सक्राइबर पैटर्न को लागू करते हैं, जिससे ऑब्जेक्ट्स अन्य ऑब्जेक्ट्स को कुछ क्रियाओं के बारे में सूचित कर सकते हैं, जबकि कंपोनेंट्स के बीच कनेक्शन कम होता है।
डेलीगेट्स और इवेंट्स का उपयोग कस्टम नोटिफिकेशन, यूजर इंटरफेस इंटरेक्शन, लॉगिंग मैकेनिज्म, प्लगइन सिस्टम और शेड्यूल्ड टास्क के लिए किया जाता है। डेलीगेट मेथड्स को कैप्सुलेट करता है और डायनामिक कॉल को सक्षम बनाता है, जबकि इवेंट्स यह सुनिश्चित करते हैं कि कई सब्सक्राइबर्स नोटिफिकेशन पर प्रतिक्रिया दे सकें बिना यह जाने कि कितने या कौन हैं।
इस ट्यूटोरियल में पाठक सीखेंगे कि डेलीगेट्स को कैसे डिफ़ाइन, इंस्टैंसिएट और कॉल किया जाता है, इवेंट्स कैसे बनाए और सब्सक्राइब किए जाते हैं, और ये अवधारणाएँ OOP प्रिंसिपल्स, डेटा स्ट्रक्चर और एल्गोरिदम के साथ वास्तविक दुनिया में कैसे लागू होती हैं।
मूल उदाहरण
textusing System;
namespace DelegatesAndEventsDemo
{
public delegate void NotificationHandler(string message);
public class Publisher
{
public event NotificationHandler Notify;
public void SendNotification(string message)
{
Notify?.Invoke(message);
}
}
public class Subscriber
{
private string _name;
public Subscriber(string name)
{
_name = name;
}
public void OnNotificationReceived(string message)
{
Console.WriteLine($"{_name} ने संदेश प्राप्त किया: {message}");
}
}
class Program
{
static void Main(string[] args)
{
Publisher publisher = new Publisher();
Subscriber alice = new Subscriber("Alice");
Subscriber bob = new Subscriber("Bob");
publisher.Notify += alice.OnNotificationReceived;
publisher.Notify += bob.OnNotificationReceived;
publisher.SendNotification("सभी सब्सक्राइबर्स को नमस्ते!");
publisher.Notify -= bob.OnNotificationReceived;
publisher.SendNotification("दूसरा संदेश");
Console.ReadLine();
}
}
इस उदाहरण में NotificationHandler
डेलीगेट मेथड्स की सिग्नेचर को परिभाषित करता है, जिससे टाइप-सुरक्षा सुनिश्चित होती है। Publisher
क्लास में Notify
इवेंट है और इसे ?.
ऑपरेटर से इनवोक किया गया है, ताकि केवल तब कॉल हो जब सब्सक्राइबर्स मौजूद हों।
Subscriber
क्लास में OnNotificationReceived
मेथड है, जो डेलीगेट के साथ संगत है। मुख्य प्रोग्राम में Publisher और Subscriber ऑब्जेक्ट बनाए जाते हैं, Events को सब्सक्राइब और ट्रिगर किया जाता है, और एक सब्सक्रिप्शन हटाकर मेमोरी लीक को रोका जाता है।
यह उदाहरण टाइप-सुरक्षित डेलीगेट्स, इवेंट इनकैप्सुलेशन, कंपोनेंट्स की डिकपलिंग और सुरक्षित इनवोकेशन जैसे उन्नत कॉन्सेप्ट्स को दर्शाता है।
व्यावहारिक उदाहरण
textusing System;
using System.Collections.Generic;
namespace DelegatesAndEventsAdvanced
{
public delegate void DataProcessedHandler(int result);
public class DataProcessor
{
public event DataProcessedHandler DataProcessed;
public void ProcessData(List<int> data)
{
int sum = 0;
foreach (var num in data)
{
if (num < 0)
{
Console.WriteLine("अमान्य संख्या को नजरअंदाज किया गया: " + num);
continue;
}
sum += num;
}
DataProcessed?.Invoke(sum);
}
}
public class Logger
{
public void LogResult(int result)
{
Console.WriteLine($"परिणाम लॉग किया गया: {result}");
}
}
public class Notifier
{
public void SendAlert(int result)
{
if (result > 50)
Console.WriteLine("अलर्ट! परिणाम सीमा से अधिक: " + result);
}
}
class Program
{
static void Main(string[] args)
{
DataProcessor processor = new DataProcessor();
Logger logger = new Logger();
Notifier notifier = new Notifier();
processor.DataProcessed += logger.LogResult;
processor.DataProcessed += notifier.SendAlert;
List<int> sampleData = new List<int> { 10, 20, 30, -5 };
processor.ProcessData(sampleData);
Console.ReadLine();
}
}
इस उदाहरण में DataProcessor
लिस्ट की संख्याओं का योग करता है और नकारात्मक मानों को छोड़ता है। DataProcessed
इवेंट Logger और Notifier को परिणाम पर प्रतिक्रिया करने की अनुमति देता है, बिना कि Producer को उनके प्रकार या संख्या का पता हो।
Logger परिणाम को लॉग करता है और Notifier चेतावनी भेजता है यदि परिणाम सीमा से अधिक है। यह Observer पैटर्न का उदाहरण है। कोड में सुरक्षित इनवोकेशन, कंपोनेंट डिकपलिंग, Single Responsibility Principle और प्रभावी त्रुटि प्रबंधन को दर्शाया गया है।
C# में Best Practices और सामान्य त्रुटियाँ:
- टाइप-सुरक्षित डेलीगेट्स और इनकैप्सुलेटेड इवेंट्स का उपयोग करें।
?.Invoke()
का प्रयोग NullReferenceException से बचने के लिए करें।- सब्सक्रिप्शन हटाएँ जब वे अब आवश्यक न हों, ताकि मेमोरी लीक से बचा जा सके।
- अनाम डेलीगेट्स के साथ सब्सक्रिप्शन में सावधानी बरतें।
- Events को लंबे समय तक चलने वाले कार्यों में मुख्य थ्रेड पर न चलाएँ।
- उच्च-फ्रीक्वेंसी Events में Delegates का न्यूनतम उपयोग करें और लूप में ऑब्जेक्ट एलोकेशन से बचें।
- डेटा वैलिडेशन सुनिश्चित करें।
📊 संदर्भ तालिका
C# Element/Concept | Description | Usage Example |
---|---|---|
Delegate | टाइप-सुरक्षित मेथड पॉइंटर | public delegate void MyDelegate(int x); |
Event | Delegate पर आधारित नोटिफिकेशन | public event MyDelegate MyEvent; |
Subscription | Event में मेथड जोड़ना | myPublisher.MyEvent += mySubscriber.MyMethod; |
Unsubscription | अनावश्यक सब्सक्रिप्शन हटाना | myPublisher.MyEvent -= mySubscriber.MyMethod; |
Conditional Invocation | सुरक्षित Event कॉल | MyEvent?.Invoke(42); |
Anonymous Delegate | इनलाइन डेलीगेट परिभाषा | myPublisher.MyEvent += (x) => Console.WriteLine(x); |
सारांश और अगले कदम:
डेलीगेट्स और इवेंट्स C# में लचीली और मॉड्यूलर एप्लिकेशन बनाने के लिए आवश्यक हैं। मुख्य अवधारणाएँ: टाइप-सुरक्षित डेलीगेट्स, इवेंट डिफ़िनिशन, सुरक्षित सब्सक्रिप्शन/अनसब्सक्रिप्शन और Observer पैटर्न का अनुप्रयोग।
आगे सीखने के लिए asynchronus प्रोग्रामिंग, LINQ के साथ डेलीगेट्स, और इवेंट-आधारित आर्किटेक्चर पर ध्यान दें। व्यावहारिक अनुप्रयोगों में नोटिफिकेशन सिस्टम, प्लगइन फ्रेमवर्क और डेटा पाइपलाइन शामिल हैं। Microsoft Docs और Open-Source प्रोजेक्ट्स अतिरिक्त संसाधन हैं।
🧠 अपने ज्ञान की परीक्षा करें
Test Your Knowledge
Test your understanding of this topic with practical questions.
📝 निर्देश
- हर प्रश्न को ध्यान से पढ़ें
- हर प्रश्न के लिए सबसे अच्छा उत्तर चुनें
- आप जितनी बार चाहें क्विज़ दोबारा दे सकते हैं
- आपकी प्रगति शीर्ष पर दिखाई जाएगी