رویداد ها (Events)

رویدادها، رفتارها یا اتفاقاتی هستند که، در هنگام اجرای برنامه روی می‌دهند. رویدادها معمولاً در برنامه‌های ویژوال مانند ویندوزها یا صفحات وب استفاده می‌شوند. برخی از رویدادها عبارتند از کلیک کردن بر روی ماوس، تایپ یک متن در TextBox، تغییر انتخاب یک آیتم در یک لیست و غیره… . در برنامه‌های کنسول، می‌توانیم به صورت دستی یک رویداد را راه اندازی کنیم. بدین صورت که، یک بلوک کد اضافه می‌کنیم که، وقتی یک حالت خاص اتفاق افتاد، اجرا شود. چندین کنترل کننده رویداد، می‌توانند به یک رویداد متصل شوند. یک کنترل کننده رویداد، متدی است که امضای آن شبیه به امضای delegate مربوط به رویداد است. زیرا هر رویداد به طور ضمنی شامل یک delegate در داخل خود است. زمانی که شما یک کنترل کننده رویداد را به یک رویداد متصل می‌کنید، در واقع شما کنترل کننده یا همان متد را در داخل delegate رویداد قرار می‌دهید. در نتیجه وقتی یک رویداد آزاد می‌شود، همه کنترل کننده‌های رویداد متصل به آن، اجرا می‌شوند. به طور کلی می‌توان گفت که :

نحوه تعریف یک رویداد به صورت زیر است :

accessSpecifier event delegateType EventName;

accessSpecifier سطح دسترسی رویداد است و event یک کلمه کلیدی که در تعریف رویداد به کار می‌رود. delegateType نوع delegate ی که مورد استفاده قرار گرفته است را مشخص می‌کند. از delegate برای تشخیص امضای کنترل کننده رویدادی که می‌تواند به آن متصل شود استفاده می‌شود. EventName هم نامی است که برای رویداد در نظر می‌گیریم. می‌توان ارتباط بین delegate و event را به صورت زیر خلاصه کرد :

برای روشن شدن موارد بالا به مثال زیر توجه کنید :

   1: using System;
   2: 
   3: public delegate void MessageHandler();                                          //step 1
   4: 
   5: public class Message
   6: {
   7:     public void DisplayMessage()                                                //step 2
   8:     {
   9:         Console.WriteLine("Hello World!");
  10:     }
  11: 
  12:     public event MessageHandler ShowMessage;                                    //step 3
  13:  
  14:     public void ExecuteEvent()                                                  //step 4
  15:     {
  16:         ShowMessage();
  17:     }
  18: }
  19:  
  20: public class Program
  21: {
  22:     public static void Main()
  23:     {
  24:         Message myMessage = new Message();
  25:         myMessage.ShowMessage += new MessageHandler(myMessage.DisplayMessage);  //step 5
  26: 
  27:         myMessage.ExecuteEvent();                                               //step 6
  28:     }
  29: }
Hello World!

در کد بالا یک delegate تعریف کرده‌ایم که مقدار برگشتی آن از نوع void بوده و هیچ پارامتری قبول نمی‌کند (خط 3). این امضاء، همان امضای کنترل کننده رویداد می‌باشد. بعد از تعریف delegate یک کلاس (خطوط 18-5) ایجاد می‌کنیم. یک کنترل کننده رویداد یا متد به نام DisplayMessage() که امضای آن شبیه امضای delegate است ایجاد می‌کنیم (خطوط 10-7). این متد در داخل delegate قرار می‌گیرد. در خط 12 یک رویداد و سپس متدی که رویداد را به صورت دستی آزاد می‌کند تعریف می‌کنیم (17-14). رویدادها نمی‌توانند در خارج از کلاسی که در آن قرار دارند آزاد شوند. بنابراین ما از متد ایجاد شده برای اجرای غیر مستقیم آنها استفاده می‌کنیم. در داخل متد Main() یک نمونه جدید از کلاس Message ایجاد می‌کنیم (خط 24). در خط بعد یک کنترل کننده رویداد به رویداد ما متصل می‌شود (خط 25). همانطور که در خط 25 مشاهده می‌کنید، برای اینکه به برنامه بفهمانیم که می‌خواهیم هنگام وقوع رویداد چه متدی از delegate اجرا شود باید به صورت زیر عمل کنیم :

EventName += new DelegateType(MethodName);

به این نکته توجه کنید که استفاده از عملگر =+ بدین معنی است که، می‌خواهیم یک کنترل کننده رویداد به لیست کنترل کننده‌های رویداد اضافه نماییم. یک نمونه از نماینده (delegate) MessageHandler ایجاد کرده و در داخل آن نام کنترل کننده رویداد را ارسال می‌کنیم (خط 25). وقتی که متد ExecuteEvent() فراخوانی می‌شود، رویداد آزاد و پیغام نمایش داده می‌شود (خط 27). در آینده به مفید بودن رویداد در هنگام کار با فرم‌های ویندوزی و صفحات وب پی خواهید برد.