دوره های آموزشی آکادمی پی وی لرن (پروژه محور و ویژه بازار کار)



  • ۲۵
  • مرداد

جلسه ۴۷ : رویدادها (Event) در #C

  • دسته‌بندی‌ها :
جلسه ۴۷ : رویدادها (Event) در #C
    • جزئیات
    • نوع محتواآموزش تصویری

      مقدمه :

      با عرض سلام و وقت بخیر خدمت کاربران سایت پی وی لرن ، با دوره کامل آموزش #C در خدمت شما دوستان هستیم. در بخش قبلی با Delegate ها و کاربرد آنها در زبان #C آشنا شدید. در این بخش در مورد رویدادها در #C و نحوه تعریف رویداد در سی شارپ صحبت می کنیم. به طور کلی، رویداد چیزی ویژه ای است که اتفاق می افتد. به عنوان مثال، مایکروسافت وقایع را برای برنامه نویسان راه اندازی می کند تا آنها را در مورد ویژگی های محصولات جدید یا موجود آگاهی یابند.

      مایکروسافت توسعه دهندگان را در مورد این رویداد از طریق ایمیل یا سایر گزینه های تبلیغاتی مطلع می کند. بنابراین در این مورد، مایکروسافت یک ناشر است که یک رویداد را راه اندازی می کند و برنامه نویس ها را در مورد آن اعلام می کند و توسعه دهندگان مشترکین این رویداد هستند و در رویداد شرکت می کنند.

      رویدادهای #C از یک مفهوم مشابه پیروی می کنند. یک رویداد دارای publisher, subscriber, notification و یک handler است.

      به طور کلی، کنترل های UI از وقایع گسترده استفاده می کنند. به عنوان مثال، کنترل دکمه در یک فرم در ویندوز دارای رویدادهای متعددی مانند click, mouseover و … است.

      یک کلاس سفارشی همچنین می تواند یک رویداد برای اطلاع رسانی به سایر کلاس های مشترک در مورد چیزی که اتفاق افتاده است یا اتفاق می افتد داشته باشد .

      بیایید ببینیم چگونه می توان یک رویداد را تعریف کرد و به سایر کلاس ها اطلاع داده می شود.

       

      نحوه تعریف رویداد :

      یک رویداد چیزی جز یک delegate محصور نشده (encapsulated) است. همانگونه که در بخش قبلی یاد گرفته ایم، یک delegate یک نوع داده ارجاعی است. شما می توانید این delegate را به صورت زیر نشان دهید:

      مثال : 

      اکنون، برای اعلام یک رویداد، قبل از اعلام یک متغیر از نوع delegate ، از کلمه کلیدی event، مانند مثال زیر استفاده کنید:

      مثال : 

      اکنون، بیایید نمونه عملی یک رویداد را ببینیم. کلاس PrintHelper زیر را که اعداد صحیح را در فرمت های مختلف مانند شماره، پول، دهدهی، درجه حرارت و هگزادسیمال چاپ می کند، در نظر بگیرید. قبل از چاپ اعداد ، رویداد beforePrintEvent اجراء می شود :

      مثال : 

      PrintHelper یک کلاس ناشر است که رویداد beforePrint را منتشر می کند. توجه داشته باشید که در هر روش چاپ، ابتدا بررسی می کند که آیا beforePrintEvent دارای مقدار خالی نیست و سپس آن را صدا میزند.

      beforePrintEvent یک شی از نماینده (delegate) BeforPrint است، بنابراین اگر یک کلاس در رویداد به اشتراک گذاشته (Subscribed) نشود ، Null خواهد بود و به همین دلیل لازم است قبل از فراخوانی یک delegate  مقدار آن بررسی شود که null نباشد.

      حالا، اجازه دهید یک subscriber ایجاد کنیم. به عنوان مثال کلاس ساده زیر را در نظر بگیرید:

      مثال : 

      تمام مشترکین (subscribers) باید یک تابع handler را فراهم کنند، که وقتی یک ناشر یک رویداد را ایجاد می کند، فراخوانی می شود.

      در مثال بالا، کلاس Number یک نمونه از PrintHelper را ایجاد می کند و با عملگر “=+” beforePrintEvent  را به اشتراک می گذارد و نام تابع را که رویداد را اداره می کند (در هنگام انتشار یک رویداد را فراخوانی می کند) printHelper_beforePrintEvent قرار می دهد.

      حالا، نمونه ای از کلاس Number و متد های چاپ را ایجاد می کنیم:

      مثال : 

      خروجی :

      مثال : 

       

      تصویر زیر مدل کلی رویداد را توضیح می دهد:

      event model

      event model

       

      رویدادها همچنین می توانند داده ها را بعنوان یک argument به subscribed خودشان منتقل کنند. یک رویداد argument را به عنوان یک delegate signature به handler منتقل می کند .

      در مثال زیر PrintHelper نماینده (delegate) BeforePrint را که یک آرگومان رشته را می پذیرد، اعلام می کند. بنابراین اکنون می توانید یک رشته را – هنگامی که رویدادی از PrintNumber یا هر متد چاپ دیگر فراخوانی می شود – ، منتقل کنید.

      مثال : 

      حالا، کلاس subscriber باید دارای یک event handler باشد که پارامتر رشته دارد.

      در مثال زیر کلاس Number دارای تابع printHelper_beforePrintEvent با پارامتر string است.

      مثال : 

      خروجی :

      مثال : 

       

      چند نکته جهت بخاطر سپردن :

      1. برای تعریف یک رویداد از کلمه کلیدی event بهمراه یک delegate استفاده کنید.
      2. قبل از استفاده از رویداد حتما آن چک کنید که خالی هست یا خیر.
      3. اشتراک در رویدادها با استفاده از اپراتور “=+” لغو اشتراک آن با استفاده از اپراتور “=-” انجام می شود.
      4. تابعی که رویداد را مدیریت (handles) می کند، event handler نامیده می شود. event handler باید همان ساختار (signature) delegate  را داشته باشد.
      5. رویدادها می توانند دارای آرگومان هایی (arguments) باشند که به تابع handler منتقل می شود.
      6. رویدادها نیز می توانند بصورت static, virtual, sealed و abstract اعلام شوند.
      7. یک رابط (Interface) نیز می تواند شامل رویداد به عنوان یک زیرمجموعه باشد.
      8. اگر subscriber وجود نداشته باشد رویدادها مطرح نخواهند شد.
      9. اگر subscriber های چندگانه وجود داشته باشند، همگام سازی رویداد ها صورت می گیرد.
      10. NETFramework. از نماینده (delegate) EventHandler و کلاس پایه EventArgs استفاده می کند.

       

      در این بخش با رویداد ها و نحوه تعریف رویدادهای سفارشی در زبان #C آشنا شدید.

      در بخش بعدی قصد داریم در رابطه با Generic ها در زبان #C صحبت کنیم.

      QR:  جلسه ۴۷ : رویدادها (Event) در #C
      به اشتراک بگذارید


      دیدگاه کاربران
      1. تصویر کاربر