1
00:00.110 --> 00:01.010
خوش برگشتید.

2
00:01.010 --> 00:03.950
تو این ویدیو قراره به سراغ multicast delegateها بریم.

3
00:03.950 --> 00:06.170
حالا که می‌دونید delegateهای عمومی چطور کار می‌کنن.

4
00:06.170 --> 00:12.230
خب، توی C\#، multicast delegateها، delegateهایی هستن که ارجاع به بیش از یک متد رو نگهداری می‌کنن.

5
00:12.230 --> 00:18.440
وقتی فراخوانی می‌شن، تمام متدهایی رو که بهشون ارجاع دادن، به همون ترتیبی که اضافه شدن، صدا می‌زنن.

6
00:18.440 --> 00:20.690
چرا باید از multicast delegateها استفاده کنید؟

7
00:20.690 --> 00:24.410
اساساً برای اینکه یک delegate بتونه چندین متد رو فراخوانی کنه.

8
00:24.410 --> 00:30.300
این برای پیاده‌سازی **event handling** (مدیریت رویداد) مفیده، جایی که چندین **listener** (شنونده) باید به یک رویداد پاسخ بدن.

9
00:30.300 --> 00:31.530
و کِی باید ازش استفاده کنید؟

10
00:31.530 --> 00:41.220
خب، وقتی نیاز دارید چندین متد به یک رویداد یا اقدام واحد پاسخ بدن، از multicast delegateها استفاده می‌کنید و این در **event handling** بسیار رایجه.

11
00:41.220 --> 00:50.040
به عنوان مثال، برای سیستم‌های اعلان (notification) و سناریوهایی که چندین اقدام باید در پاسخ به یک محرک واحد انجام بشن.

12
00:50.040 --> 00:51.180
نکته کلیدی اینجاست.

13
00:51.180 --> 00:53.130
پس بیایید این رو در عمل ببینیم.

14
00:53.140 --> 00:57.310
بنابراین ما log handler رو از قبل داریم، درسته؟

15
00:57.310 --> 01:06.040
پس ما **public void log handler** رو همراه با logger داریم، که شامل متدهای **LogToConsole** و **LogToFile** هست.

16
01:06.040 --> 01:11.980
حالا ما log handler خودمون رو داریم که **LogToConsole** رو بهش اضافه کردیم، خب.

17
01:11.980 --> 01:19.390
حالا به جای اینکه log handler رو مستقیماً صدا بزنم، می‌گم که می‌خوام یه چیز دیگه‌ای رو به log handler اضافه کنم.

18
01:19.390 --> 01:26.140
با استفاده از **plus equal** (علامت جمع مساوی) و از **logger.LogToFile** استفاده می‌کنم.

19
01:26.140 --> 01:36.010
این کار همین الان log handler ما رو تبدیل به یک multicast delegate می‌کنه، چون دو متد بهش اختصاص داده شده.

20
01:36.010 --> 01:40.930
یکی **LogToFile** و اون یکی **LogToConsole** هست.

21
01:40.930 --> 01:52.340
این **plus equal** فقط داره می‌گه به متد قدیمی که از قبل اونجاست، یا متدهایی که از قبل اونجا هستن، یه دونه دیگه اضافه کن.

22
01:52.340 --> 01:58.220
پس **LogToFile** رو هم اضافه کن که هر وقت log handler اجرا بشه، اون هم اجرا خواهد شد.

23
01:58.220 --> 02:04.970
حالا بیایید log handler رو فراخوانی کنیم و یک پیام string بهش پاس بدیم.

24
02:05.000 --> 02:06.750
مثلاً: Log this info.

25
02:06.750 --> 02:07.980
اوکی، برای مثال.

26
02:07.980 --> 02:09.630
پس خیلی ساده‌ست.

27
02:09.630 --> 02:16.590
بیایید این رو اجرا کنیم و می‌بینیم که می‌گه: console log: Log this info و file log: Log this info.

28
02:16.590 --> 02:20.940
پس نکته جالب اینجاست که حالا در چندین مکان لاگ گرفت.

29
02:20.940 --> 02:23.400
و این می‌تونه در مناطق مختلف دیگه‌ای هم لاگ بگیره.

30
02:23.400 --> 02:31.000
مثلاً می‌تونیم در صفحه نمایش لاگ بگیریم، یا در لاگ داخل debuggerمون، می‌تونیم در یک فایل لاگ بگیریم.

31
02:31.000 --> 02:39.520
همچنین می‌تونیم خیلی کارهای مختلف دیگه انجام بدیم که بعد از اجرای log handler ما اتفاق بیفتن، وقتی جزئیاتی بهش پاس داده می‌شه.

32
02:39.520 --> 02:43.930
پس این فقط یک مثال خیلی ساده از نحوه کار multicast delegateهاست.

33
02:43.930 --> 02:48.640
پس دوباره، در این دو خط، ما یک multicast delegate ایجاد می‌کنیم.

34
02:48.640 --> 02:54.500
و اینجا داریم multicast delegate رو فراخوانی می‌کنیم.

35
02:54.530 --> 03:02.030
حالا، اگه می‌خواید متدی رو از multicast delegate حذف کنید، می‌تونید این کار رو به روشی مشابه اضافه کردنش انجام بدید.

36
03:02.030 --> 03:05.750
پس می‌تونید فقط بگید: **log handler minus equal** (علامت منها مساوی).

37
03:05.750 --> 03:11.150
و سپس می‌تونیم فقط بگیم **logger dot** و متدی رو که می‌خوایم حذف کنیم، پاک کنیم.

38
03:11.150 --> 03:14.480
پس فرض کنید متد **LogToFile** رو حذف می‌کنیم.

39
03:14.480 --> 03:27.330
و حالا می‌تونیم log handler رو یک بار دیگه با عبارت "after removing log to file" (بعد از حذف LogToFile) استفاده کنیم، اوکی.

40
03:27.330 --> 03:29.160
پس بذارید این کار رو بکنم.

41
03:29.160 --> 03:35.130
به این شکل. بیایید دوباره این رو اجرا کنیم و می‌بینیم که می‌گه: console log: Log this info.

42
03:35.130 --> 03:44.700
پس console log: Log this info، file log: Log this info. و بعدش فقط console log که می‌گه: after removing log to file، چون متد **LogToFile** رو حذف کردیم.

43
03:44.700 --> 03:53.070
دیگه فراخوانی نمی‌شه، چون بخشی از اجرای کلی multicast delegate ما نیست.

44
03:53.100 --> 03:58.350
حالا ما اینجا یک خطا می‌گیریم که وقتی موس رو روش می‌برید می‌گه: log handler اینجا **null** نیست.

45
03:58.350 --> 04:02.640
پس واقعاً یک مشکل نیست، اما هنوز هم احتمال **null reference assignment** (تخصیص ارجاع null) وجود داره.

46
04:02.640 --> 04:07.780
و اینجا می‌گه: log handler ممکنه اینجا **null** باشه، چون چیزی از log handler حذف شده.

47
04:07.780 --> 04:10.240
پس ممکنه متدی حذف شده باشه یا متدی حذف شده.

48
04:10.240 --> 04:20.650
بنابراین ممکنه که دیگه هیچ متدی به این log handler گوش نده، یا دیگه به log handler اختصاص داده نشده باشه، و در اون صورت ممکنه با خطا مواجه بشه.

49
04:20.650 --> 04:22.180
پس چطور می‌تونیم این رو رفع کنیم؟

50
04:22.180 --> 04:26.860
خب، بهترین شیوه اینه که واقعاً مطمئن بشیم فراخوانی رو به صورت **ایمن** انجام می‌دیم.

51
04:26.860 --> 04:31.000
پس بذارید یک متد سریع ایجاد کنم یا در واقع بذارید این کار رو تو ویدیوی بعدی انجام بدیم، اوکی؟

52
04:31.000 --> 04:31.630
اونجا می‌بینمتون.