1
00:00.110 --> 00:00.890
خوش برگشتید.

2
00:00.890 --> 00:03.410
تو این ویدیو می‌خوایم شروع کنیم و نگاهی به **event**ها بندازیم.

3
00:03.410 --> 00:14.810
و eventها چیزی هستن که قراره کمی بیشتر از فقط همین یه ویدیو با ما همراه باشن، اما واقعاً مهم، واقعاً قدرتمند و یک مفهوم اصلیه که روی **delegate**ها بنا شده.

4
00:14.810 --> 00:20.390
به خاطر همینه که مهم بود قبل از اینکه بپریم سراغ eventها، اصول اولیه delegateها رو بفهمید.

5
00:20.390 --> 00:21.860
پس eventها چی هستن؟

6
00:21.860 --> 00:27.710
event یک راهیه برای یک **class** که به **class**ها یا **object**های دیگه خبر بده که اتفاق جالبی افتاده.

7
00:27.710 --> 00:29.650
eventها بر اساس **delegate**ها کار می‌کنن.

8
00:29.650 --> 00:31.240
به خاطر همینه که به delegateها نیاز داریم، درسته؟

9
00:31.270 --> 00:33.790
پس چرا باید از eventها استفاده کنیم؟

10
00:33.820 --> 00:41.020
eventها یک **class** رو قادر می‌سازن تا اعلان‌هایی (notifications) ارائه بده، بدون اینکه بدونه کدوم class یا object دیگه اون اعلان‌ها رو دریافت می‌کنه.

11
00:41.020 --> 00:45.040
و این باعث **loose coupling** (اتصال سست) و **separation of concerns** (جدایی دغدغه‌ها) می‌شه.

12
00:45.040 --> 01:05.200
پس این واقعاً باحاله، چون اساساً شما می‌تونید کدی بنویسید که بعداً بره و هرچیزی که یک قطعه کد دیگه تصمیم گرفته اجرا بشه رو اجرا کنه. و اون کد دیگه نمی‌دونه که شما دارید به اون کد گوش می‌دید، و منتظرید تا کاری انجام بده که شما بتونید کاری انجام بدید، این واقعاً باحاله.

13
01:05.200 --> 01:06.700
و کِی باید از یک event استفاده کنید؟

14
01:06.700 --> 01:13.030
خب، وقتی نیاز به مکانیزمی دارید که یک **object** بتونه **object**های دیگه رو در مورد تغییرات یا اقدامات مطلع کنه.

15
01:13.030 --> 01:24.210
و eventها رو کجا خواهید دید؟ خب، معمولاً در سناریوهایی مثل **logging**، **monitoring**، تغییرات داده، کلیک‌های دکمه، کلیک‌های کیبورد و هر موقعیتی که مکانیزم اعلان (notification mechanism) مورد نیاز باشه، استفاده می‌شن.

16
01:24.210 --> 01:28.650
پس بیایید جلو بریم و اولین event کوچیکمون رو بسازیم.

17
01:28.650 --> 01:31.650
و برای این کار اول به یک **delegate** نیاز داریم.

18
01:31.650 --> 01:40.530
پس اول بیایید یک **public delegate** بسازیم. و این هیچی برنمی‌گردونه و **notify** نامیده می‌شه.

19
01:40.560 --> 01:41.250
بسیار خب.

20
01:41.250 --> 01:44.900
و فقط با یک **message** اعلان می‌کنه. چیز خیلی ساده‌ای.

21
01:44.900 --> 01:46.850
ما این رو قبلاً چندین بار دیدیم، درسته؟

22
01:46.850 --> 01:57.740
پس یک event بر اساس **delegate**هایی بنا شده که **signature** متدهایی رو تعریف می‌کنن که بعداً event رو **handle** خواهند کرد، اوکی؟

23
01:57.740 --> 02:02.660
پس این **signature** متدهاییه که باید event رو **handle** کنن.

24
02:02.660 --> 02:07.450
حالا بیایید یک **class** بسازیم که بتونه **event**ها رو **publish** کنه.

25
02:07.450 --> 02:10.180
پس اساساً جایی که eventها شروع به وقوع می‌کنن.

26
02:10.180 --> 02:16.450
پس **public class** و این یکی **EventPublisher** خواهد بود.

27
02:16.450 --> 02:20.470
و قراره یک **public event** ایجاد کنیم.

28
02:20.470 --> 02:25.870
و اون از نوع **Notify** خواهد بود و **OnNotify** نامیده می‌شه.

29
02:25.870 --> 02:28.420
پس شما از قبل کلمه کلیدی **On** رو اینجا می‌بینید.

30
02:28.420 --> 02:31.300
و این **On** در واقع مهمه.

31
02:31.300 --> 02:33.280
این دلبخواه نیست.

32
02:33.280 --> 02:37.420
واقعاً مهمه چون نشون می‌ده که داریم در مورد یک **event** صحبت می‌کنیم.

33
02:37.420 --> 02:43.090
پس این وقتی **event** **trigger** بشه، اجرا خواهد شد.

34
02:43.090 --> 02:51.070
بنابراین نشون می‌ده که این متد فقط یک متد معمولی نیست، بلکه متدیه که وقتی یک **event** خاص رخ می‌ده، فراخوانی می‌شه، اوکی؟

35
02:51.070 --> 02:58.840
بنابراین حالا بیایید جلو بریم و فقط یک متد داشته باشیم که بتونه اون **event** رو **raise** (راه بیندازه) کنه. پس من این رو **RaiseEvent** صدا می‌زنم.

36
02:58.840 --> 03:06.640
پس **raising an event** به این معنیه که شما اساساً دارید **event** رو شروع می‌کنید. دارید می‌گید: هی event، شروع کنیم، اوکی؟

37
03:06.640 --> 03:19.820
و می‌بینید که این **RaiseEvent** هم هیچی برنمی‌گردونه. و یک **string** می‌گیره یا پارامترش یک **string** هست. پس اینجا کاری که قراره انجام بدیم اینه که از **OnNotify** استفاده می‌کنیم.

38
03:19.820 --> 03:22.340
و قراره **Invoke** کنیم.

39
03:22.340 --> 03:36.020
و این متد **Invoke** event رو فراخوانی می‌کنه اگه هر **subscriber**ای وجود داشته باشه. و به خاطر همینه که ما اینجا علامت سوال رو داریم. پس این **OnNotify** می‌تونه اساساً هیچ **subscriber**ای نداشته باشه.

40
03:36.020 --> 03:47.050
پس هیچ کس ممکنه به اون event گوش نده یا منتظر نباشه تا اون event **trigger** بشه و کاری انجام بده وقتی اون event **trigger** می‌شه. به خاطر همینه که فقط **Invoke** می‌کنه.

41
03:47.050 --> 03:55.750
پس فقط **delegate** **Notify** رو اجرا می‌کنه وقتی **subscriber**هایی برای **event** وجود داشته باشن.

42
03:55.750 --> 04:02.890
پس حالا چطور می‌تونیم مطمئن بشیم که در **event** **subscribe** (مشترک) می‌شیم؟ و برای این کار قراره یک **class** دیگه بسازیم.

43
04:02.890 --> 04:06.130
پس **public class EventSubscriber**.

44
04:06.130 --> 04:17.110
و حالا این **class** در اینجا فقط یک متد **public void OnEventRaised** و یک **string message** خواهد داشت.

45
04:17.110 --> 04:24.760
و اینجا من فقط قراره یه چیزی روی **console** بنویسم، چیزی مثل **Event received** و بعد هرچیزی که **message** بوده، اوکی؟

46
04:24.760 --> 04:25.900
**plus message**.

47
04:25.900 --> 04:30.520
پس این **EventSubscriber** ماست. اینجا **EventPublisher**مون رو داریم.

48
04:30.520 --> 04:33.790
حالا می‌تونیم اعلان کنیم.

49
04:33.790 --> 04:41.250
می‌تونیم **event** رو **raise** کنیم، که **OnNotify** رو **Invoke** خواهد کرد، هر **event**ای که داخلش باشه. پس منتظر **trigger** شدن event هستن.

50
04:41.250 --> 04:51.180
و حالا داخل متد **main**مون، بیایید بریم جلو و از **EventPublisher** و **EventSubscriber**مون استفاده کنیم.

51
04:51.450 --> 04:54.270
**EventSubscriber** اینطور.

52
04:54.270 --> 04:58.940
و بعد از **publisher**مون با **OnNotify** خودش استفاده کنیم.

53
04:58.940 --> 05:07.160
می‌بینید که **Notify** ما حالا این آیکون رعد و برق رو اینجا داره. پس این نشون می‌ده که داریم در مورد یک **event** صحبت می‌کنیم، اوکی؟

54
05:07.160 --> 05:09.620
پس این **OnNotify event** هست.

55
05:09.620 --> 05:19.010
و ما قراره با استفاده از **subscriber.OnEventRaised** در اون **event** **subscribe** بشیم.

56
05:19.010 --> 05:29.170
و این فقط قراره یک **subscriber** باشه. البته می‌تونیم چندین **subscriber** داشته باشیم و حالا **publisher** ما می‌تونه هر وقت اتفاقی افتاد، **event** رو **raise** کنه.

57
05:29.170 --> 05:32.800
پس می‌تونیم فقط یک تست اجراش کنیم.

58
05:32.800 --> 05:33.460
اوکی.

59
05:33.460 --> 05:39.430
و اینجا قراره کد **Read Key** رو داشته باشم تا کدم متوقف نشه، **read key**.

60
05:39.460 --> 05:47.520
حالا بیایید این رو اجرا کنیم و باید ببینیم که **subscriber** ما از کل اتفاقی که داره می‌افته، **event**ای که داره می‌افته مطلع می‌شه،

61
05:47.520 --> 05:52.150
و می‌گه **event received test**.

62
05:52.150 --> 06:02.020
پس کلی کد پیچیده فقط برای راه‌اندازی یک **event** و اساساً فقط برای نوشتن چیزی روی **console**. و حالا ممکنه بپرسید که چرا این مهمه؟

63
06:02.020 --> 06:05.860
چرا باید به ایجاد یک **event** اهمیت بدید اگه فقط می‌خواید کد اجرا کنید؟

64
06:05.860 --> 06:19.080
خب، نکته اینجاست که همه این چیزها می‌تونن **event**هایی باشن که ما خودمون ننوشتیم، اما می‌تونیم در اون **event**ها **subscribe** بشیم و حالا هر وقت اون اتفاق بیفته، می‌تونیم مطلع بشیم.

65
06:19.080 --> 06:27.600
بنابراین، به عنوان مثال، هر وقت کاربر کلیدی رو روی کیبورد فشار می‌ده، این می‌تونه یک **event** باشه که چیزی رو **trigger** می‌کنه.

66
06:27.600 --> 06:30.510
پس بیایید سریع آنچه رو که دیدیم خلاصه کنیم.

67
06:30.510 --> 06:37.820
نکته اینجاست که این واقعاً فقط برای اینه که **syntax** (نحو) رو بفهمید. هنوز در مورد دیدن مثال‌های دنیای واقعی نیست.

68
06:37.820 --> 06:43.190
ما قراره این کار رو تو ویدیوی بعدی شروع کنیم. قراره یک مثال کمی واقعی‌تر بسازیم.

69
06:43.190 --> 06:57.790
اما به طور کلی ساختار اینه که اگه می‌خواید eventهای خودتون و **listener**های خودتون رو بسازید، یا **subscriber**ها، باید **delegate**تون رو با **method declaration**ای که می‌خواید eventهاتون استفاده کنن، تنظیم کنید.

70
06:57.790 --> 07:07.030
بنابراین بعد ما این کلمه کلیدی **On** رو داریم هر وقت یک **event** رو با استفاده از **delegate**مون تنظیم می‌کنیم.

71
07:07.030 --> 07:19.360
پس می‌بینید که ما این کلمه کلیدی **public** رو داریم تا بتونیم از **event** از خارج این **class** استفاده کنیم، کلمه کلیدی **event** رو داریم. و بعد داریم از **delegate**مون که قبلاً ساختیم، استفاده می‌کنیم.

72
07:19.360 --> 07:27.100
و یک اسم بهش می‌دیم که با **On** شروع می‌شه. ما همچنین داخل **EventPublisher**مون، نیاز داریم **event** رو **raise** کنیم.

73
07:27.100 --> 07:35.980
و می‌بینید که این **raised event** از همون ساختار پیروی می‌کنه. و بعد اینجا داریم از **OnNotify** استفاده می‌کنیم که می‌تونه **null** باشه، به خاطر همینه که داریم از **nullable** استفاده می‌کنیم.

74
07:35.980 --> 07:44.460
و داریم هر **listener**ای که وجود داره رو **Invoke** می‌کنیم. پس داریم تمام **listener**ها رو **Invoke** می‌کنیم.

75
07:44.460 --> 07:55.230
ما این رو قبلاً در **Multicast Delegate** دیدیم، جایی که چندین آیتم فراخوانی داشتیم، و اونها رو یکی یکی فراخوانی می‌کردیم.

76
07:55.230 --> 08:05.700
و حالا می‌بینید که اساساً داریم همون کار رو اینجا انجام می‌دیم. داریم تمام آیتم‌ها، تمام **subscriber**هایی که دارن به **OnNotify** من گوش می‌دن رو **Invoke** می‌کنیم.

77
08:05.700 --> 08:11.750
پس اینجا داریم یک **EventSubscriber** آماده می‌کنیم. و می‌گیم هر وقت اون **event** **raise** شد، چه اتفاقی باید بیفته.

78
08:11.750 --> 08:18.650
و می‌بینید که همون ساختاره: **void OnEventRaised string message**. پس همون **declaration** (اعلان) به عنوان **delegate** ما.

79
08:18.650 --> 08:26.660
و در اینجا ما فقط از کد خودمون استفاده می‌کنیم، هرچیزی که می‌خوایم وقتی کد اتفاق می‌افته، رخ بده. پس در این حالت، ما فقط داریم روی **console** اعلان می‌کنیم.

80
08:26.660 --> 08:29.600
و بعد داریم **publisher** رو آماده می‌کنیم. داریم **subscriber** رو آماده می‌کنیم.

81
08:29.600 --> 08:38.800
داریم **publisher.OnNotify** رو تنظیم می‌کنیم و **subscribe** با متد **EventRaised** ما که باید هر وقت **event** **raise** می‌شه، صدا زده بشه.

82
08:38.800 --> 08:51.910
پس **OnEventRaised**، بعد می‌خوایم هرچیزی که اینجا تعریف کردیم رو اجرا کنیم و اون بعداً وقتی متد **RaiseEvent** **publisher** فراخوانی می‌شه، صدا زده خواهد شد. پس این یکی در اینجا.

83
08:51.910 --> 09:02.440
وقتی این متد فراخوانی می‌شه، بعد داریم **event** رو **raise** می‌کنیم و داریم هر متد دیگه ای که داره به ما گوش می‌ده رو اجرا می‌کنیم.

84
09:02.440 --> 09:16.960
پس اگه ما گوش می‌دادیم، مثل اینکه فرض کنید اینها دو **class** متفاوت هستن که حالا دارن گوش می‌دن و منتظرن تا **event** اتفاق بیفته. حالا وقتی اون اتفاق می‌افته، می‌بینید که هر دو **event** دریافت شدن و **test** اجرا شد.

85
09:16.960 --> 09:21.850
اوکی، می‌گم این برای این ویدیو کافیه. تو ویدیوی بعدی قراره به مثال دنیای واقعی نگاه کنیم.