خوش برگشتید.
تو این ویدیو می‌خوایم شروع کنیم و نگاهی به **event**ها بندازیم.
و eventها چیزی هستن که قراره کمی بیشتر از فقط همین یه ویدیو با ما همراه باشن، اما واقعاً مهم، واقعاً قدرتمند و یک مفهوم اصلیه که روی **delegate**ها بنا شده.
به خاطر همینه که مهم بود قبل از اینکه بپریم سراغ eventها، اصول اولیه delegateها رو بفهمید.
پس eventها چی هستن؟
event یک راهیه برای یک **class** که به **class**ها یا **object**های دیگه خبر بده که اتفاق جالبی افتاده.
eventها بر اساس **delegate**ها کار می‌کنن.
به خاطر همینه که به delegateها نیاز داریم، درسته؟
پس چرا باید از eventها استفاده کنیم؟
eventها یک **class** رو قادر می‌سازن تا اعلان‌هایی (notifications) ارائه بده، بدون اینکه بدونه کدوم class یا object دیگه اون اعلان‌ها رو دریافت می‌کنه.
و این باعث **loose coupling** (اتصال سست) و **separation of concerns** (جدایی دغدغه‌ها) می‌شه.
پس این واقعاً باحاله، چون اساساً شما می‌تونید کدی بنویسید که بعداً بره و هرچیزی که یک قطعه کد دیگه تصمیم گرفته اجرا بشه رو اجرا کنه. و اون کد دیگه نمی‌دونه که شما دارید به اون کد گوش می‌دید، و منتظرید تا کاری انجام بده که شما بتونید کاری انجام بدید، این واقعاً باحاله.
و کِی باید از یک event استفاده کنید؟
خب، وقتی نیاز به مکانیزمی دارید که یک **object** بتونه **object**های دیگه رو در مورد تغییرات یا اقدامات مطلع کنه.
و eventها رو کجا خواهید دید؟ خب، معمولاً در سناریوهایی مثل **logging**، **monitoring**، تغییرات داده، کلیک‌های دکمه، کلیک‌های کیبورد و هر موقعیتی که مکانیزم اعلان (notification mechanism) مورد نیاز باشه، استفاده می‌شن.
پس بیایید جلو بریم و اولین event کوچیکمون رو بسازیم.
و برای این کار اول به یک **delegate** نیاز داریم.
پس اول بیایید یک **public delegate** بسازیم. و این هیچی برنمی‌گردونه و **notify** نامیده می‌شه.
بسیار خب.
و فقط با یک **message** اعلان می‌کنه. چیز خیلی ساده‌ای.
ما این رو قبلاً چندین بار دیدیم، درسته؟
پس یک event بر اساس **delegate**هایی بنا شده که **signature** متدهایی رو تعریف می‌کنن که بعداً event رو **handle** خواهند کرد، اوکی؟
پس این **signature** متدهاییه که باید event رو **handle** کنن.
حالا بیایید یک **class** بسازیم که بتونه **event**ها رو **publish** کنه.
پس اساساً جایی که eventها شروع به وقوع می‌کنن.
پس **public class** و این یکی **EventPublisher** خواهد بود.
و قراره یک **public event** ایجاد کنیم.
و اون از نوع **Notify** خواهد بود و **OnNotify** نامیده می‌شه.
پس شما از قبل کلمه کلیدی **On** رو اینجا می‌بینید.
و این **On** در واقع مهمه.
این دلبخواه نیست.
واقعاً مهمه چون نشون می‌ده که داریم در مورد یک **event** صحبت می‌کنیم.
پس این وقتی **event** **trigger** بشه، اجرا خواهد شد.
بنابراین نشون می‌ده که این متد فقط یک متد معمولی نیست، بلکه متدیه که وقتی یک **event** خاص رخ می‌ده، فراخوانی می‌شه، اوکی؟
بنابراین حالا بیایید جلو بریم و فقط یک متد داشته باشیم که بتونه اون **event** رو **raise** (راه بیندازه) کنه. پس من این رو **RaiseEvent** صدا می‌زنم.
پس **raising an event** به این معنیه که شما اساساً دارید **event** رو شروع می‌کنید. دارید می‌گید: هی event، شروع کنیم، اوکی؟
و می‌بینید که این **RaiseEvent** هم هیچی برنمی‌گردونه. و یک **string** می‌گیره یا پارامترش یک **string** هست. پس اینجا کاری که قراره انجام بدیم اینه که از **OnNotify** استفاده می‌کنیم.
و قراره **Invoke** کنیم.
و این متد **Invoke** event رو فراخوانی می‌کنه اگه هر **subscriber**ای وجود داشته باشه. و به خاطر همینه که ما اینجا علامت سوال رو داریم. پس این **OnNotify** می‌تونه اساساً هیچ **subscriber**ای نداشته باشه.
پس هیچ کس ممکنه به اون event گوش نده یا منتظر نباشه تا اون event **trigger** بشه و کاری انجام بده وقتی اون event **trigger** می‌شه. به خاطر همینه که فقط **Invoke** می‌کنه.
پس فقط **delegate** **Notify** رو اجرا می‌کنه وقتی **subscriber**هایی برای **event** وجود داشته باشن.
پس حالا چطور می‌تونیم مطمئن بشیم که در **event** **subscribe** (مشترک) می‌شیم؟ و برای این کار قراره یک **class** دیگه بسازیم.
پس **public class EventSubscriber**.
و حالا این **class** در اینجا فقط یک متد **public void OnEventRaised** و یک **string message** خواهد داشت.
و اینجا من فقط قراره یه چیزی روی **console** بنویسم، چیزی مثل **Event received** و بعد هرچیزی که **message** بوده، اوکی؟
**plus message**.
پس این **EventSubscriber** ماست. اینجا **EventPublisher**مون رو داریم.
حالا می‌تونیم اعلان کنیم.
می‌تونیم **event** رو **raise** کنیم، که **OnNotify** رو **Invoke** خواهد کرد، هر **event**ای که داخلش باشه. پس منتظر **trigger** شدن event هستن.
و حالا داخل متد **main**مون، بیایید بریم جلو و از **EventPublisher** و **EventSubscriber**مون استفاده کنیم.
**EventSubscriber** اینطور.
و بعد از **publisher**مون با **OnNotify** خودش استفاده کنیم.
می‌بینید که **Notify** ما حالا این آیکون رعد و برق رو اینجا داره. پس این نشون می‌ده که داریم در مورد یک **event** صحبت می‌کنیم، اوکی؟
پس این **OnNotify event** هست.
و ما قراره با استفاده از **subscriber.OnEventRaised** در اون **event** **subscribe** بشیم.
و این فقط قراره یک **subscriber** باشه. البته می‌تونیم چندین **subscriber** داشته باشیم و حالا **publisher** ما می‌تونه هر وقت اتفاقی افتاد، **event** رو **raise** کنه.
پس می‌تونیم فقط یک تست اجراش کنیم.
اوکی.
و اینجا قراره کد **Read Key** رو داشته باشم تا کدم متوقف نشه، **read key**.
حالا بیایید این رو اجرا کنیم و باید ببینیم که **subscriber** ما از کل اتفاقی که داره می‌افته، **event**ای که داره می‌افته مطلع می‌شه،
و می‌گه **event received test**.
پس کلی کد پیچیده فقط برای راه‌اندازی یک **event** و اساساً فقط برای نوشتن چیزی روی **console**. و حالا ممکنه بپرسید که چرا این مهمه؟
چرا باید به ایجاد یک **event** اهمیت بدید اگه فقط می‌خواید کد اجرا کنید؟
خب، نکته اینجاست که همه این چیزها می‌تونن **event**هایی باشن که ما خودمون ننوشتیم، اما می‌تونیم در اون **event**ها **subscribe** بشیم و حالا هر وقت اون اتفاق بیفته، می‌تونیم مطلع بشیم.
بنابراین، به عنوان مثال، هر وقت کاربر کلیدی رو روی کیبورد فشار می‌ده، این می‌تونه یک **event** باشه که چیزی رو **trigger** می‌کنه.
پس بیایید سریع آنچه رو که دیدیم خلاصه کنیم.
نکته اینجاست که این واقعاً فقط برای اینه که **syntax** (نحو) رو بفهمید. هنوز در مورد دیدن مثال‌های دنیای واقعی نیست.
ما قراره این کار رو تو ویدیوی بعدی شروع کنیم. قراره یک مثال کمی واقعی‌تر بسازیم.
اما به طور کلی ساختار اینه که اگه می‌خواید eventهای خودتون و **listener**های خودتون رو بسازید، یا **subscriber**ها، باید **delegate**تون رو با **method declaration**ای که می‌خواید eventهاتون استفاده کنن، تنظیم کنید.
بنابراین بعد ما این کلمه کلیدی **On** رو داریم هر وقت یک **event** رو با استفاده از **delegate**مون تنظیم می‌کنیم.
پس می‌بینید که ما این کلمه کلیدی **public** رو داریم تا بتونیم از **event** از خارج این **class** استفاده کنیم، کلمه کلیدی **event** رو داریم. و بعد داریم از **delegate**مون که قبلاً ساختیم، استفاده می‌کنیم.
و یک اسم بهش می‌دیم که با **On** شروع می‌شه. ما همچنین داخل **EventPublisher**مون، نیاز داریم **event** رو **raise** کنیم.
و می‌بینید که این **raised event** از همون ساختار پیروی می‌کنه. و بعد اینجا داریم از **OnNotify** استفاده می‌کنیم که می‌تونه **null** باشه، به خاطر همینه که داریم از **nullable** استفاده می‌کنیم.
و داریم هر **listener**ای که وجود داره رو **Invoke** می‌کنیم. پس داریم تمام **listener**ها رو **Invoke** می‌کنیم.
ما این رو قبلاً در **Multicast Delegate** دیدیم، جایی که چندین آیتم فراخوانی داشتیم، و اونها رو یکی یکی فراخوانی می‌کردیم.
و حالا می‌بینید که اساساً داریم همون کار رو اینجا انجام می‌دیم. داریم تمام آیتم‌ها، تمام **subscriber**هایی که دارن به **OnNotify** من گوش می‌دن رو **Invoke** می‌کنیم.
پس اینجا داریم یک **EventSubscriber** آماده می‌کنیم. و می‌گیم هر وقت اون **event** **raise** شد، چه اتفاقی باید بیفته.
و می‌بینید که همون ساختاره: **void OnEventRaised string message**. پس همون **declaration** (اعلان) به عنوان **delegate** ما.
و در اینجا ما فقط از کد خودمون استفاده می‌کنیم، هرچیزی که می‌خوایم وقتی کد اتفاق می‌افته، رخ بده. پس در این حالت، ما فقط داریم روی **console** اعلان می‌کنیم.
و بعد داریم **publisher** رو آماده می‌کنیم. داریم **subscriber** رو آماده می‌کنیم.
داریم **publisher.OnNotify** رو تنظیم می‌کنیم و **subscribe** با متد **EventRaised** ما که باید هر وقت **event** **raise** می‌شه، صدا زده بشه.
پس **OnEventRaised**، بعد می‌خوایم هرچیزی که اینجا تعریف کردیم رو اجرا کنیم و اون بعداً وقتی متد **RaiseEvent** **publisher** فراخوانی می‌شه، صدا زده خواهد شد. پس این یکی در اینجا.
وقتی این متد فراخوانی می‌شه، بعد داریم **event** رو **raise** می‌کنیم و داریم هر متد دیگه ای که داره به ما گوش می‌ده رو اجرا می‌کنیم.
پس اگه ما گوش می‌دادیم، مثل اینکه فرض کنید اینها دو **class** متفاوت هستن که حالا دارن گوش می‌دن و منتظرن تا **event** اتفاق بیفته. حالا وقتی اون اتفاق می‌افته، می‌بینید که هر دو **event** دریافت شدن و **test** اجرا شد.
اوکی، می‌گم این برای این ویدیو کافیه. تو ویدیوی بعدی قراره به مثال دنیای واقعی نگاه کنیم.