Delegates and Events in C#: किसी भी Program में Event इस बात का एक Automatic Notification होता है कि कोई Action Perform हुआ है। Events किसी भी Event Driven Programming Languages की एक Common Requirement होते हैं। Event Driven Programming के अन्तर्गत जब भी किसी Program में कोई Event Trigger होता है यानी कोई Action Perform होता है, तो Program के किसी दूसरे हिस्से को इस बात का Notification दिया जाना होता है कि कोई Event Trigger हुआ है। इस Requirement को Fulfill करने के लिए सामान्यत: Publisher/Subscriber Pattern को Use किया जाता है।
इस Pattern के अन्तर्गत एक Class विभिन्न प्रकार के Events Declare करता है, जिनकी जरूरत Program के किसी अन्य हिस्से को होती है। इस Class को Publisher के नाम से जाना जाता है। जबकि Program की अन्य Classes, Publisher Class में Defined Events के Trigger होने का Notification प्राप्त करने हेतु Publisher पर Sign-Up करते हैं और Sign-Up करने के रूप में Publisher को एक Method Supply करते हैं। इन Notification प्राप्त करने हेतु Register करने वाली Classes को Subscriber कहते हैं।
परिणामस्वरूप जब कोई Event Trigger होता है, Publisher Class एक “Event Trigger” करता है और उस Event के लिए जिन-जिन Subscriber Classes ने Subscribe या Sign-Up किया है, उन सभी Subscriber Classes द्वारा Subscription के समय Supplied Method को Publisher Class द्वारा Execute कर दिया जाता है।
Subscribers द्वारा जो Methods Supply किए जाते हैं, उन्हें Callback Methods कहते हैं, क्योंकि इन Methods को Execute करके Publisher फिर से Subscriber को Call करता है। जबकि अन्य शब्दों में इन्हीं Callback Methods को Event Handler भी कहा जाता है। क्योंकि ये Callback Methods ही Trigger होने वाले Event को Handle करते हैं या Trigger होने वाले Event के Response में Execute होते हैं। निम्न चित्र द्वारा हम इस प्रक्रिया को थोडा आसानी से समझ सकते हैं:
Events के सन्दर्भ में कुछ याद रखने योग्य महत्वपूर्ण बातें निम्नानुसार हैं:
Publisher
ये एक Class या Structure होता है जो किसी Event को Publish या Define करता है, ताकि अन्य Classes उस समय इन Events से Notify हो सकें, जब Publisher द्वारा इन Events को Trigger किया जाए।
Subscriber
ये वे Classes या Structures होते हैं जो किसी Event के Trigger होने पर Notify होना चाहते हैं।
Event Handler
ये एक Method होता है जो Subscriber के माध्यम से किसी Publisher के साथ Register होता है और उस समय Execute होता है, जब Publisher उस Event को Trigger करता है, जिसके Notification के लिए Subscriber ने Subscribe किया है। Event Handler Method को हम समान Class/Structure में भी Define कर सकते हैं और किसी External Class/Structure में भी।
Raising an Event or Triggering Event
जब कोई Event Trigger होता है, तो हम इसे “Raising an Event” या “Triggering an Event” के नाम से जानते हैं। अन्य शब्दों में इसे “Invoking an Event” या “Firing an Event” भी कहा जाता है। जब कोई Event Fire होता है, तो उस Event के लिए Registered सभी Methods Invoke या Call हो जाते हैं।
Events वास्तव में पूरी तरह से पिछले Chapter यानी Delegate के Concept पर ही आधारित हैं और Events के ज्यादातर Concepts पूरी तरह से Delegate के Concepts के समान ही हैं। वास्तव में एक Event एक प्रकार का Delegate ही होता है, जिसे किसी Particular Requirement को पूरा करने के लिए Specialized किया गया होता है।
Delegates व Events के Behavior के बीच काफी समानताऐं हैं, क्योंकि Events पूरी तरह से Delegates पर ही आधारित हैं। Event एक प्रकार के Private Delegate के समान होता है, जो अपने Privately Controlled Delegate पर Organized Access Provide करता है। यानी हम Private Delegate को जिस तरह से Directly Access नहीं कर सकते, उसी तरह से हम Events के Private Delegate को भी Directly Access नहीं कर सकते।
Delegate के साथ हम जितनी तरह की प्रक्रियाऐं कर सकते हैं, वे सभी प्रक्रियाऐं हम Events के साथ नहीं कर सकते। यानी Events के साथ हम केवल किसी Event Handler को Add, Remove या Invoke करने के अलावा और कुछ नहीं कर सकते।
जब कोई Event Trigger होता है, तो ये Event Private Delegate को ही Invoke करता है, जो कि अपने Invocation List के सभी Methods को Sequentially Call करता है। Event के Internal Architecture को हम कुछ निम्नानुसार दर्शा सकते हैं:
जैसाकि हम इस चित्र में देख सकते हैं कि += व -= Operators ही किसी Event के User Interface होते हैं। यानी हम केवल इन्हीं का प्रयोग करके Callback Methods को Event के Internal Private Delegate के Invocation List में Add या Remove कर सकते हैं। इनके अलावा हम किसी Event के साथ और कोई Operation Perform नहीं कर सकते, क्योंकि इन Callback Methods को Execute करने का काम Event स्वयं ही अपने स्तर पर करता है। सरल शब्दों में कहें तो Event एक प्रकार का Encapsulated Delegate होता है।
Delegates and Events in C# – Source Parts of Event Mechanism
जब हम Events को Use करना चाहते हैं, तब हमें Event Handling के लिए 5 Code Parts Create करने पडते हैं। जिन्हें निम्न चित्र द्वारा Represent किया जा सकता है:
Delegate Type Declaration
Trigger होने वाले Event व Event Handler का Signature व Return Type एक समान होना जरूरी होता है, क्योंकि Event एक प्रकार का Delegate होता है, जो Event Handler Method को Invoke या Callback करता है।
Event Handler Declaration
जब Event Trigger होता है, तब उस Trigger होने वाले Event के Response में जिन Event Handler को Execute या Invoke करना होता है, वे Event Handler इस Subscriber Section में Define किए जाते हैं। ये Event Handler Methods, Normal Named Method के अलावा Un-Named Anonymous Method अथवा Lambda Expression भी हो सकते हैं।
Event Declaration
Publisher Class जिन Event को Trigger करना चाहता है, उन्हें इस Section में Define करता है। इन्हीं Events से Subscriber Class Register करता है।
Event Registration
Subscriber को उन Event के लिए Register करना पडता है, जिनके Trigger होने पर वह Notify होना चाहता है। ये काम इस Code Section में पूरा किया जाता है और Event Handler को Event के साथ Connect किया जाता है।
Code to fire the Event
Code के इस Section में वह Code लिखना होता है, जो Event को Fire करता है, ताकि उस Event के साथ Registered सभी Event Handlers को Delegate Callback कर सके।
Delegates and Events in C# – Event Declaration
Event पूरी तरह से Delegate पर आधारित होते हैं। इसलिए Publisher Class को हमेंशा एक Event Object Provide करना होता है, जो कि एक Delegate Type होता है। जैसे:
class EventDefinition
{
public event EventHandler triggeredEvent;
. . .
}
इस Code Segment में हमने EventDefinition Class में event Keyword का प्रयोग करते हुए एक EventHandler Delegate Type का एक triggeredEvent नाम का एक Object Declare किया है।
चूंकि EventDefinition वह Class है, जिसमें triggeredEvent नाम के Event को Define किया जा रहा है, इसलिए EventDefinition एक Publisher Class है। जबकि EventHandler वह Delegate Type है, जिसके Object triggeredEvent के Fire होने का Notification प्राप्त करने के लिए Subscribers Register करते हैं।
Registration के रूप में Subscribers, Publisher Object (triggeredEvent) को जो Event Handler Method Supply करते हैं, उन्हें triggeredEvent Delegate Object अपनी Invocation List में Add करता है तथा triggeredEvent के Fire होने पर यानी triggeredEvent को Call करने पर इसकी Invocation List के सभी Callback Methods यानी Subscribed Event Handlers Invoke हो जाते है।
जिस तरह से हमने उपरोक्त Code Segment में triggeredEvent नाम का User Defined Event Specify किया है, उसी तरह से हम एक Comma Separated List के रूप में एक से ज्यादा Events को Declare कर सकते हैं। जैसे:
class EventDefinition
{
public event EventHandler triggeredEvent1, triggeredEvent2, triggeredEvent3;
. . .
}
इसी तरह से यदि हम चाहें तो अपने Custom Event को static Keyword Specify करते हुए Static Event के रूप में भी Declare कर सकते हैं। जैसे:
class EventDefinition
{
public static event EventHandler triggeredEvent1, triggeredEvent2, triggeredEvent3;
. . .
}
C# में हम जो Event Declare करते हैं, वे सभी Publisher Class के Member होते हैं, ठीक उसी तरह से, जिस तरह से Fields, Properties, Methods, Indexers आदि किसी Class के Member होते हैं और चूंकि Events वास्तव में Publisher Class के Member होते हैं, इसलिए हम इन्हें Executable Code के Block में Declare नहीं कर सकते, बल्कि हमें Events को हमेंशा Class/Structure के अन्दर अन्य Members की तरह ही Declare करना होता है। साथ ही एक Event Member हमेंशा Implicitly null मान से Initialized होता है।
जैसाकि हम उपरोक्त Code Segment द्वारा समझ सकते हैं कि जब हम Event Declare करते हैं, तो हमें हमारे Event के नाम को एक Delegate Type के नाम के साथ Specify करना होता है। हम यदि चाहें तो अपना स्वयं का Delegate Declare कर सकते हैं अथवा पहले से Defined Delegate को भी Use कर सकते हैं।
जब हम हमारा स्वयं का Delegate Declare करते हैं, तो ये जरूरी होता है कि हमारे Delegate Type का Signature व Return Type, Publisher द्वारा Trigger होने वाले Events का Notification प्राप्त करने के लिए Register करने वाले Subscriber द्वारा Supplied Callback Event Handler Method के Signature व Return Type से Match हो।
जबकि यदि हम चाहें तो .NET Framework के BCL (Base Class Library) में Specified EventHandler नाम के Delegate को भी अपनी Publisher Class में Events Declare करने के लिए उपयोग में ले सकते हैं, जिसे System Events के साथ प्रक्रिया करने के लिए Define किया गया है। यानी हमें अलग से अपना स्वयं का EventHandler Delegate Create करने की जरूरत नहीं है।
इसीलिए हमने हमारे उपरोक्त Code Segment में कोई Delegate Define नहीं किया है, बल्कि सीधे ही EventHandler Delegate का प्रयोग करके triggeredEvent नाम के Event को Define किया है।
Delegates and Events in C# – Event Subscription
Subscribers हमेंशा Event के Trigger होने का Notification प्राप्त करने के लिए, एक Event Handler को EventHandler Delegate Type के triggeredEvent Object की Invocation List में एक नया Callback Event Handler Method Add करते हैं।
इसलिए triggeredEvent Object में Add होने वाले Event Handler Method का Signature व Return Type, EventHandler Delegate Type के Signature व Return Type के समान होना जरूरी होता है।
चूंकि triggeredEvent Object भी एक Delegate Type का Object ही होता है, इसलिए जिस तरह से Delegate Type के Object में नया Callback Method Add करने के लिए हम += Operator को Use करते हैं, उसी तरह से Subscriber द्वारा Supplied Callback Event Handler Method को triggeredEvent Object की Invocation List में Add करने के लिए भी हमें += Operator को ही Use करना होता है।
जबकि Event Handler Specification के रूप में हम किसी Instance Method का नाम, Static Method का नाम, Anonymous Method अथवा Lambda Expression का प्रयोग कर सकते हैं। जैसे:
ये Article इस वेबसाईट पर Selling हेतु उपलब्ध EBook C#.NET in Hindi से लिया गया है। इसलिए यदि ये Article आपके लिए उपयोगी रहा, तो निश्चित रूप से ये पुस्तक भी आपके लिए काफी उपयोगी साबित होगी।
C#.NET in Hindi | Page:908 | Format: PDF
