خوش برگشتید.
تو این ویدیو قراره به سراغ multicast delegateها بریم.
حالا که می‌دونید delegateهای عمومی چطور کار می‌کنن.
خب، توی C\#، multicast delegateها، delegateهایی هستن که ارجاع به بیش از یک متد رو نگهداری می‌کنن.
وقتی فراخوانی می‌شن، تمام متدهایی رو که بهشون ارجاع دادن، به همون ترتیبی که اضافه شدن، صدا می‌زنن.
چرا باید از multicast delegateها استفاده کنید؟
اساساً برای اینکه یک delegate بتونه چندین متد رو فراخوانی کنه.
این برای پیاده‌سازی **event handling** (مدیریت رویداد) مفیده، جایی که چندین **listener** (شنونده) باید به یک رویداد پاسخ بدن.
و کِی باید ازش استفاده کنید؟
خب، وقتی نیاز دارید چندین متد به یک رویداد یا اقدام واحد پاسخ بدن، از multicast delegateها استفاده می‌کنید و این در **event handling** بسیار رایجه.
به عنوان مثال، برای سیستم‌های اعلان (notification) و سناریوهایی که چندین اقدام باید در پاسخ به یک محرک واحد انجام بشن.
نکته کلیدی اینجاست.
پس بیایید این رو در عمل ببینیم.
بنابراین ما log handler رو از قبل داریم، درسته؟
پس ما **public void log handler** رو همراه با logger داریم، که شامل متدهای **LogToConsole** و **LogToFile** هست.
حالا ما log handler خودمون رو داریم که **LogToConsole** رو بهش اضافه کردیم، خب.
حالا به جای اینکه log handler رو مستقیماً صدا بزنم، می‌گم که می‌خوام یه چیز دیگه‌ای رو به log handler اضافه کنم.
با استفاده از **plus equal** (علامت جمع مساوی) و از **logger.LogToFile** استفاده می‌کنم.
این کار همین الان log handler ما رو تبدیل به یک multicast delegate می‌کنه، چون دو متد بهش اختصاص داده شده.
یکی **LogToFile** و اون یکی **LogToConsole** هست.
این **plus equal** فقط داره می‌گه به متد قدیمی که از قبل اونجاست، یا متدهایی که از قبل اونجا هستن، یه دونه دیگه اضافه کن.
پس **LogToFile** رو هم اضافه کن که هر وقت log handler اجرا بشه، اون هم اجرا خواهد شد.
حالا بیایید log handler رو فراخوانی کنیم و یک پیام string بهش پاس بدیم.
مثلاً: Log this info.
اوکی، برای مثال.
پس خیلی ساده‌ست.
بیایید این رو اجرا کنیم و می‌بینیم که می‌گه: console log: Log this info و file log: Log this info.
پس نکته جالب اینجاست که حالا در چندین مکان لاگ گرفت.
و این می‌تونه در مناطق مختلف دیگه‌ای هم لاگ بگیره.
مثلاً می‌تونیم در صفحه نمایش لاگ بگیریم، یا در لاگ داخل debuggerمون، می‌تونیم در یک فایل لاگ بگیریم.
همچنین می‌تونیم خیلی کارهای مختلف دیگه انجام بدیم که بعد از اجرای log handler ما اتفاق بیفتن، وقتی جزئیاتی بهش پاس داده می‌شه.
پس این فقط یک مثال خیلی ساده از نحوه کار multicast delegateهاست.
پس دوباره، در این دو خط، ما یک multicast delegate ایجاد می‌کنیم.
و اینجا داریم multicast delegate رو فراخوانی می‌کنیم.
حالا، اگه می‌خواید متدی رو از multicast delegate حذف کنید، می‌تونید این کار رو به روشی مشابه اضافه کردنش انجام بدید.
پس می‌تونید فقط بگید: **log handler minus equal** (علامت منها مساوی).
و سپس می‌تونیم فقط بگیم **logger dot** و متدی رو که می‌خوایم حذف کنیم، پاک کنیم.
پس فرض کنید متد **LogToFile** رو حذف می‌کنیم.
و حالا می‌تونیم log handler رو یک بار دیگه با عبارت "after removing log to file" (بعد از حذف LogToFile) استفاده کنیم، اوکی.
پس بذارید این کار رو بکنم.
به این شکل. بیایید دوباره این رو اجرا کنیم و می‌بینیم که می‌گه: console log: Log this info.
پس console log: Log this info، file log: Log this info. و بعدش فقط console log که می‌گه: after removing log to file، چون متد **LogToFile** رو حذف کردیم.
دیگه فراخوانی نمی‌شه، چون بخشی از اجرای کلی multicast delegate ما نیست.
حالا ما اینجا یک خطا می‌گیریم که وقتی موس رو روش می‌برید می‌گه: log handler اینجا **null** نیست.
پس واقعاً یک مشکل نیست، اما هنوز هم احتمال **null reference assignment** (تخصیص ارجاع null) وجود داره.
و اینجا می‌گه: log handler ممکنه اینجا **null** باشه، چون چیزی از log handler حذف شده.
پس ممکنه متدی حذف شده باشه یا متدی حذف شده.
بنابراین ممکنه که دیگه هیچ متدی به این log handler گوش نده، یا دیگه به log handler اختصاص داده نشده باشه، و در اون صورت ممکنه با خطا مواجه بشه.
پس چطور می‌تونیم این رو رفع کنیم؟
خب، بهترین شیوه اینه که واقعاً مطمئن بشیم فراخوانی رو به صورت **ایمن** انجام می‌دیم.
پس بذارید یک متد سریع ایجاد کنم یا در واقع بذارید این کار رو تو ویدیوی بعدی انجام بدیم، اوکی؟
اونجا می‌بینمتون.