Delegate و Event در سی شارپ – تفاوت و نحوه استفاده + مثال

حسین نوری کادیجانی
حسین نوری کادیجانی
۱۴۰۵/۰۷/۲۹
۱۵ دقیقه
۲۲
آموزش متنی جامع

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

آنچه در این مطلب می‌آموزید:
  • با مفهوم Delegate و Event در سی شارپ و کاربرد هرکدام آشنا خواهید شد.
  • نحوه تعریف و استفاده از delegate چند ریختی را یاد خواهید گرفت.
  • با نحوه تعریف Event و ارتباط آن با Delegate آشنا خواهید شد.
  • تفاوت‌ها و کاربردهای Delegate و Event در سی شارپ را بررسی می‌کنید.
  • مزایا، محدودیت‌ها و نکات مهم استفاده از Delegate و Event را یاد می‌گیرید.
Delegate و Event در سی شارپ – تفاوت و نحوه استفاده + مثال
فهرست مطالب این نوشته
997696

Delegate و Event در سی شارپ

Delegate و Event در سی شارپ دو مفهوم مرتبط اما متفاوت هستند که برای فراخوانی متدها و مدیریت رویدادهای برنامه استفاده می‌شوند. Delegate نوعی داده است که می‌تواند به یک یا چند متد با پارامترها و نوع خروجی مشخص اشاره کند و امکان اجرای آن‌ها را فراهم سازد. در مقابل، Event مکانیزمی مبتنی بر Delegate است که برای اطلاع‌رسانی درباره وقوع یک رویداد و اجرای متدهای مرتبط با آن کاربرد دارد.

تفاوت اصلی این دو مفهوم در نحوه استفاده از آن‌ها است. Delegate امکان ارجاع به متدها و فراخوانی مستقیم آن‌ها را فراهم می‌کند، اما Event به بخش‌های مختلف برنامه اجازه می‌دهد تا برای دریافت اعلان یک رویداد ثبت‌نام کنند. در این حالت، اجرای رویداد از خارج از نوع تعریف‌کننده آن امکان‌پذیر نیست. برای مثال، در برنامه‌ای که عملیات دانلود فایل انجام می‌دهد، می‌توان از Event برای اعلام پایان دانلود استفاده کرد. در این شرایط، Delegate نوع متدهایی را مشخص می‌کند که در پاسخ به این رویداد اجرا می‌شوند.

دیاگرام نحوه کارکرد delegate
نحوه کارکرد delegate

در تصویر زیر نیز، کارکرد event را مشاهده می‌کنید:

دیاگرام نحوه کارکرد event
نحوه کارکرد event

در ادامه، نحوه تعریف، استفاده و تفاوت Delegate و Event را با مثال‌های عملی بررسی می‌کنیم. پیش از آن، پیشنهاد می‌کنیم فیلم آموزش برنامه نویسی سی شارپ #C در سطح مقدماتی همراه با گواهینامه از فرادرس را تماشا کنید تا با اصول این زبان آشنا شوید. لینک این فیلم را در ادامه آورده‌ایم:

Delegate در سی شارپ چیست؟

Delegate در زبان برنامه نویسی سی شارپ یک «نوع» (Type) است که می‌تواند به یک یا چند متد با ساختار مشخص اشاره کند. به زبان ساده، Delegate را می‌توان ابزاری برای ذخیره و انتقال متدها را در نظر گرفت.

این مفهوم را می‌توان مشابه متغیری دانست که به یک تابع اشاره می‌کند و امکان اجرای آن را نیز فراهم می‌سازد. البته باید توجه داشت که Delegate متغیر نیست و تنها به متد مورد نظر ارجاع می‌کند. Delegate در سی شارپ روشی برای رفتار با متدها به عنوان شی را مشخص می‌کند و سناریوهایی مانند مدیریت رویداد، فراخوانی‌های برگشتی و برنامه نویسی به سبک تابعی را امکان‌پذیر می‌کند.

درک Delegate با مثال واقعی

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

یک دکمه در برنامه‌ای خاص را در نظر بگیرید. برنامه قرار نیست از قبل مشخص کند با فشردن این دکمه دقیقاً چه کاری انجام شود. به عنوان مثال، فشردن این دکمه در صفحه‌های مختلف نتایج زیر را به همراه دارد.

  • نمایش پیام
  • ذخیره اطلاعات
  • ارسال ایمیل

در واقع، دکمه فقط می‌داند که باید یک کار را اجرا کند، اما مشخص نیست آن کار دقیقاً چیست. این مفهوم بسیار به عملکرد Delegate نزدیک است. Delegate خودش کاری انجام نمی‌دهد، بلکه مشخص می‌کند کدام متد باید اجرا شود.

درک آسان Delegate در سی شارپ با مثال

برای درک بهتر مفهوم Delegate فرض کنید که متدی با نامSayHello() وجود دارد که یک پیام را در خروجی نمایش می‌دهد.

در حالت عادی برای اجرای این متد کافی است تا آن را در بخشی از برنامه به صورت زیر فراخوانی کرد.

در زبان برنامه نویسی سی شارپ می‌توان یک Delegate تعریف کرد که به این متد اشاره کند.

در مثال بالا،MyDelegate یک نوع Delegate است که به متدهایی اشاره می‌کند که پارامتری دریافت نمی‌کنند و مقدار بازگشتی نیز ندارند. بعد از تعریف Delegate می‌توان یک متغیر از نوع آن ایجاد کرد و متدSayHello() را به آن نسبت داد.

در این حالت، متغیرmyDelegate به متدSayHello() اشاره می‌کند. بنابراین، با اجرای دستور زیر متدSayHello() فراخوانی خواهد شد.

نحوه تعریف Delegate در #C

برای تعریف Delegate در سی شارپ باید از کلمه کلیدیdelegate استفاده کرد. در هنگام تعریف Delegate باید نوع مقدار بازگشتی و لیست پارامترهای متد را مشخص کرد. ساختار کلی تعریف Delegate در سی شارپ به صورت زیر است.

در ساختار بالا هر کدام از موارد به صورت زیر مشخص می‌شوند.

  • modifier: سطح دسترسی Delegate را مشخص می‌کند و می‌تواند مقادیری مانندprivate ،public وinternal داشته باشد.
  • delegate: کلمه کلیدی مورد استفاده برای تعریف Delegate است.
  • return_type: نوع مقدار بازگشتی متد را مشخص می‌کند.
  • delegate_name: نام مشخص شده برای Delegate را نشان می‌دهد.
  • parameter_list: پارامترهای دریافت شده توسط متد را مشخص می‌کند.

قطعه کد زیر نحوه تعریف Delegate در سی شارپ را نشان می‌دهد.

در مثال بالا یک Delegate با نامMyDelegate تعریف شده است. این Delegate می‌تواند به متدهایی اشاره کند که یک پارامتر از نوع «رشته» (String) دریافت می‌کنند و مقدار بازگشتی آن‌ها نیز از نوعvoid است.

مثال استفاده از Delegate

به عنوان مثال، متد زیر با تعریفMyDelegate مطابقت دارد.

در گام بعدی یک متغیر از نوعMyDelegate ایجاد می‌شود و متدDisplayMessage به آن نسبت داده می‌شود.

متغیرdel به متدDisplayMessage اشاره می‌کند و می‌توان Delegate را مانند یک متد فراخوانی کرد.

خروجی قطعه کد بالا نیز به صورت زیر خواهد بود.

Message: Hello from delegate!

در این مثال،MyDelegate مشخص کرده است که متد متصل به آن باید یک ورودی از نوعstring دریافت کند و مقدار بازگشتی نیز نداشته باشد. متدDisplayMessage ساختاری مشابه با این تعریف را دارد. بنابراین، می‌توان آن را به delegate متصل کرد.

کد کامل مربوط به مثال Delegate

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

جریان اجرای برنامه بر اساس مثال بالا به صورت زیر خواهد بود.

ترتیب اجرای delegate در سی شارپ به صورت گام به گام آورده شده است - delegate و event در سی شارپ
ترتیب اجرای delegate در سی شارپ

به زبان ساده، Delegate ابتدا نوع متد مورد نظر خود را مشخص می‌کند و سپس متد سازگار با آن به Delegate متصل می‌شود.

تا این بخش از مطلب با مفاهیم Delegate و Event در سی شارپ آشنا شده‌ایم و مثال‌هایی از آن‌ها را بررسی کرده‌ایم. در ادامه، کاربرد این دو را در عمل و در ترکیب با هم یاد می‌گیریم. پیش از آن، پیشنهاد می‌کنیم برای دسترسی سریع و همیشگی به مطالب آموزشی برنامه‌نویسی، اپلیکیشن رایگان مجله فرادرس را نصب کنید:

برای نصب اپلیکیشن رایگان مجله فرادرس، کلیک کنید.

انواع Delegate در سی شارپ

Delegateها در سی شارپ را از نظر تعداد متدهای متصل می‌توان به ۲ دسته زیر تقسیم کرد.

  • Singlecast Delegate
  • Multicast Delegate
انواع Delegate در سی شارپ در تصویر نشان داده شده است - Delegate و Event در سی شارپ
انواع Delegate در سی شارپ

Singlecast Delegate چیست؟

این نوع از delegate در هر لحظه تنها به یک متد اشاره می‌کند. به عنوان مثال، در کد زیرmyDelegate فقط به متدShowMessage() متصل شده است.

در مثال بالا، با اجرایmyDelegate() تنها متدShowMessage() اجرا می‌شود. بنابراین، Singlecast Delegate برای زمانی مناسب است که Delegate تنها یک متد را در خود نگه می‌دارد.

Multicast Delegate چیست؟

یکی از ویژگی‌ها Delegate در سی شارپ امکان اتصال همزمان آن به چند متد مختلف است. به این نوع از delegateها در اصطلاح Delegate چندریختی گفته می‌شود.

برای درک بهتر این مفهوم فرض کنید که یک برنامه باید بعد از انجام یک کار، چند عملیات مختلف را اجرا کند. به عنوان مثال، پس از ثبت یک سفارش عملیات‌های زیر باید به ترتیب انجام شود.

  • نمایش پیام موفقیت
  • ذخیره اطلاعات سفارش
  • ارسال اعلان برای کاربر

در حالت عادی می‌توان هر ۳ متد را به صورت جداگانه فراخوانی کرد.

اما Delegate می‌تواند همزمان به چند متد متصل شود و تنها با یک مرتبه فراخوانی، همه متدها را اجرا کند.

Delegate چندریختی در سی شارپ در تصویر نشان داده شده است که چگونه می‌تواند به چندین متد به صورت همزمان وصل شود - Delegate و Event در سی شارپ
Delegate چندریختی در سی شارپ

مثال ساده از delegate چندریختی در سی شارپ

ابتدا باید یک Delegate تعریف کرد.

سپس، متدهای مورد نظر را به صورت جداگانه ایجاد کرد.

در ادامه یک متغیر از نوعMyDelegate تعریف شده است و اولین متد به آن نسبت داده می‌شود.

برای اضافه کردن متدهای دیگر به delegate باید از عملگر+= استفاده کرد.

در این حالت، delegate به صورت همزمان به ۳ متد مختلف اشاره می‌کند. بنابراین، تنها با یک مرتبه فراخوانی هر ۳ متد به صورت همزمان اجرا خواهند شد.

در نهایت، خروجی برنامه به صورت زیر خواهد بود.

پیام نمایش داده شد.
اطلاعات ذخیره شد.
اعلان ارسال شد.

یادگیری برنامه نویسی سی شارپ با فرادرس

سی‌ شارپ یکی از زبان‌های پر کاربرد در حوزه برنامه‌ نویسی است که حوزه‌های مختلفی کاربرد دارد. این زبان برنامه نویسی در زمینه توسعه نرم‌افزارهای دسکتاپ، وب، بازی‌ سازی و بسیاری از پروژه‌های مبتنی بر پلتفرم Net. مورد استفاده قرار می‌گیرد. بنابراین، فرصت‌های شغلی بسیاری خوبی در زمینه‌های مختلف برای علاقه‌مندان به این زبان برنامه نویسی وجود دارد.

یادگیری مفاهیم پایه و پیشرفته این زبان از جمله کلاس‌ها، شیءگرایی، Delegate ،Event و مدیریت خطا می‌تواند مسیر ورود به حوزه‌های مختلف برنامه‌ نویسی را هموار کند. خوشبختانه فرادرس فیلم‌های آموزشی متنوعی در زمینه زبان برنامه نویسی سی شارپ منتشر کرده است که این فیلم‌ها از طریق لینک زیر قابل‌دسترسی هستند:

در این مجموعه آموزش‌های متنوعی برای افراد با سطوح مختلف یادگیری وجود دارد که می‌توانند با توجه به سطح خود از مبتدی تا حرفه‌ای از این آموزش‌ها استفاده کنند. اگر قصد یادگیری سی شارپ از سطح مقدماتی تا پیشرفته را دارید، می‌توانید از آموزش‌های موجود در این مجموعه استفاده کنید. در ادامه تعدادی از دوره‌های پیشنهادی موجود در این مجموعه آورده شده است.

مجموعه آموزش برنامه نویسی سی شارپ C#‎ – مقدماتی تا پیشرفته فرادرس
برای دسترسی به مجموعه فیلم آموزش برنامه نویسی سی شارپ C#‎ از مقدماتی تا پیشرفته در فرادرس، روی تصویر کلیک کنید.

چندریختی Delegate در سی شارپ

در سی شارپ یک Delegate می‌تواند به صورت همزمان به چند متد مختلف اشاره کند که به آن Multicast Delegate گفته می‌شود.

در خصوص کار با این نوع delegate به موارد زیر باید توجه کرد.

  • افزودن متد به delegate
  • حذف متد از delegate
  • ترتیب اجرای متدها
نکات مهم Delegate چندریختی در سی شارپ در تصویر آورده شده است - Delegate و Event در سی شارپ
نکات مهم Delegate چندریختی در سی شارپ

افزودن متد به delegate

برای اضافه کردن متد به delegate باید از عملگر+= استفاده کرد.

در این حالت،myDelegate به ۳ متد اشاره می‌کند و با فراخوانی آن هر ۳ متد به صورت همزمان اجرا می‌شوند.

حذف متد از delegate

برای حذف متد از delegate می‌توان از عملگر-= استفاده کرد.

پس از این دستور متدMethod2 در زمان فراخوانی delegate اجرا نخواهد شد.

ترتیب اجرای متدها

نکته مهم دیگر در خصوص delegate چندریختی ترتیب اجرای متدها است. در این نوع delegate متدها به همان ترتیب اضافه شدن به delegate اجرا می‌شوند.

Event در سی شارپ چیست؟

«رویداد» (Event) در سی‌شارپ مکانیزمی برای اطلاع‌رسانی درباره وقوع یک اتفاق در برنامه است. به کمک Event می‌توان به بخش‌های مختلف برنامه اعلام کرد که اتفاق خاصی رخ داده است.

به عنوان مثال، هر کدام از موارد زیر می‌توانند باعث ایجاد Event در برنامه شوند.

  • کلیک بر روی یک دکمه
  • تغییر وضعیت یک شی
  • پایان یک عملیات

delegate و event در سی شارپ معمولاً در کنار یکدیگر مورد استفاده قرار می‌گیرند. در این ساختار، Event وقوع اتفاق را اعلام می‌کند و Delegate مشخص می‌کند که چه متدهایی در واکنش به آن رویداد باید اجرا شوند. به زبان ساده، Event مسئول اعلام وقوع یک اتفاق است و Delegate مشخص می‌کند در پاسخ به آن اتفاق چه متدی باید اجرا شود.

نحوه تعریف و استفاده از Event

برای تعریف Event در سی شارپ ابتدا باید یک delegate تعریف کرد. سپس، Event بر اساس آن delegate ایجاد می‌شود.

در مثال بالا، ابتدا یک delegate با نامMyDelegate تعریف شده است. سپس، Event بر اساس آن delegate ایجاد شده است. در ادامه، می‌توان یک یا چند متد را به Event متصل کرد.

از عملگر+= برای اضافه کردن متد به Event می‌توان استفاده کرد. برای حذف متد از Event نیز می‌توان از عملگر-= استفاده کرد. در نهایت، برای اجرای Event ساخته شده از دستورInvoke استفاده می‌شود.

تفاوت Event و Delegate در سی شارپ چیست؟

delegate و event در سی شارپ ارتباط بسیار نزدیکی با یکدیگر دارند. با این حال، این دو مفهوم یکسان نیستند. delegate نوعی است که می‌تواند به یک یا چند متد مشخص اشاره کند، در حالی که event برای اعلام وقوع رویداد و مدیریت واکنش به آن مورد استفاده قرار می‌گیرد.

در جدول زیر تفاوت‌های اصلی delegate و event در سی شارپ آورده شده است.

DelegateEvent
به متد یا متدها اشاره می‌کند.وقوع یک رویداد را اعلام می‌کند.
می‌تواند مستقیماً فراخوانی شود.فقط در کلاس تعریف‌کننده اجرا می‌شود.
می‌تواند مستقل از Event استفاده شود.معمولاً بر پایه Delegate ایجاد می‌شود.

به زبان ساده، delegate ابزاری برای اتصال متدها به یکدیگر است، ولی Event مکانیزمی برای اطلاع رسانی درباره وقوع یک اتفاق است.

مثال عملی استفاده همزمان از Event و Delegate

برای درک بهتر مفهوم delegate و event در سی شارپ مثال عملی زیر آورده شده است.

در قطعه کد بالا، با فراخوانی Event متدShowMessage اجرا می‌شود. خروجی برنامه به صورت زیر است.

Event is Running

در این مثال،MyDelegate مشخص می‌کند که Event چه نوع متدی را می‌تواند دریافت کند. سپس، متدShowMessageبه‌MyEvent متصل می‌شود و با اجرای Event این متد فراخوانی می‌شود.

کاربردهای Delegate و Event در سی شارپ

delegate و event در سی شارپ بیشتر زمانی مورد استفاده قرار می‌گیرند که بخش‌های مختلف یک برنامه باید با یکدیگر ارتباط داشته باشند. در واقع، این دو مفهوم ارتباط بین بخش‌های مختلف برنامه را امکان‌پذیر می‌کنند.

در ادامه مهم‌ترین کاربردهای delegate و event آورده شده است.

کاربردهای Delegate و Event در سی شارپ به صورت موردی آورده شده است.
کاربردهای Delegate و Event در سی شارپ

مدیریت رویدادها

یکی از مهم‌ترین کاربردهای Event در سی شارپ مدیریت رویدادهای مختلف در برنامه است. به عنوان مثال، در برنامه‌های گرافیکی می‌توان برای رویدادهایی نظیر کلیک روی دکمه، تغییر مقدار یک کنترل یا بسته شدن پنجره از Event استفاده کرد. به عنوان مثال، در برنامه زیر با کلیک بر روی دکمه یک پیام در خروجی نمایش داده می‌شود.

در مثال بالا،ButtonClicked یک Event است که وقوع کلیک رو دکمه را نشان می‌دهد. متدShowMessage نیز به این Event متصل شده است. با اجرا شدن Event متدShowMessage فراخوانی شده و پیام مربوط به کلیک نمایش داده می‌شود. خروجی نیز به صورت زیر خواهد بود.

Button Clicked!

اجرای Callback

از Delegate می‌توان برای پیاده‌سازی Callback استفاده کرد. Callback یا فراخوانی مجدد به روشی گفته می‌شود که در آن یک متد به‌عنوان ورودی در اختیار یک متد دیگر قرار می‌گیرد تا پس از انجام یک عملیات، متد موردنظر فراخوانی شود. به عنوان مثال، در کد زیر یک Delegate تعریف شده است و سپس، متدShowResult به‌عنوان Callback به متدCalculate ارسال می‌شود.

سپس، می‌توان متدShowResult را هنگام فراخوانیCalculate ارسال کرد.

خروجی برنامه به صورت زیر خواهد بود.

result: 30

در این مثال،Calculate عملیات محاسبه را انجام می‌دهد و پس از پایان عملیات متد دریافت شده به‌ عنوان Callback را اجرا می‌کند. به زبان ساده، Callback یعنی بعد از انجام این کار، این متد را اجرا کن.

اجرای چند متد با یک فراخوانی

با استفاده از delegate چندریختی می‌توان به صورت همزمان چند متد را به یک delegate متصل کرد. در نتیجه، با یک مرتبه فراخوانی تمام متدهای متصل شده به ترتیب اجرا می‌شوند.

در مثال بالا، دو متد بهmyDelegate متصل شده است و تنها با یک مرتبه فراخوانی delegate، هر دو متد به ترتیب اجرا می‌شوند.

ارتباط بین بخش‌های مختلف برنامه

با استفاده از Event در سی شارپ می‌توان بین بخش‌های مختلف برنامه ارتباط ایجاد کرد. یک بخش می‌تواند وقوع یک اتفاق را اعلام کند و بخش‌های دیگر برنامه به آن Event واکنش نشان دهند.

خروجی برنامه به صورت زیر خواهد بود.

process info...
process completed...

در این مثال، کلاس‌DataProcessor مسئول انجام پردازش است و پس از پایان کار، Event مربوط به اتمام پردازش را اجرا می‌کند. بخش دیگری از برنامه نیز می‌تواند به این Event واکنش نشان دهد.

برنامه نویسی غیرهمزمان

Delegate و Event در سی شارپ می‌توانند برای اطلاع‌رسانی درباره وضعیت یا پایان عملیات‌های طولانی مانند پردازش داده، دریافت اطلاعات یا انجام یک کار در پس‌زمینه نیز مورد استفاده قرار گیرند. به عنوان مثال، یک برنامه می‌تواند هنگام تغییر درصد پیشرفت یک عملیات، این تغییر را به بخش دیگری از برنامه اعلام کند.

خروجی این برنامه به صورت زیر خواهد بود.

progress: 0%
progress: 50%
progress: 100%

در این مثال، هر بار که مقدار پیشرفت تغییر می‌کند، Event مورد نظر اجرا شده و مقدار جدید به متد ShowProgress ارسال می‌شود. پیش‌تر در مطلب زیر از مجله فرادرس به مفاهیم عمومی موجود در برنامه نویسی غیرهمزمان پرداخته شده است.

مزایای Delegate و Event در سی شارپ

استفاده از delegate و event در طراحی برنامه‌های سی شارپ مزایای مختلفی دارد.

در ادامه مهم‌ترین مزایای delegate و event آورده شده است.

  • کاهش وابستگی بین بخش‌های مختلف برنامه
  • افزایش انعطاف‌پذیری
  • امکان اجرای چند متد
  • مناسب برای برنامه‌های رویداد محور
مزایای Delegate و Event در سی شارپ در تصویر نشان داده شده است.
مزایای Delegate و Event در سی شارپ

کاهش وابستگی بین بخش‌های مختلف برنامه

Event امکان ارتباط بین بخش‌های مختلف برنامه را بدون ایجاد وابستگی مستقیم فراهم می‌کند. یک بخش می‌تواند وقوع یک رویداد را اعلام کند و بخش‌های دیگر به آن واکنش نشان دهند.

افزایش انعطاف‌پذیری

با استفاده از Delegate می‌توان متدهای مختلفی را در زمان اجرا به یک ساختار متصل کرد. بنابراین، برای تغییر رفتار برنامه، همیشه نیازی به تغییر کد اصلی نیست.

امکان اجرای چند متد

Multicast Delegate امکان اتصال چند متد به یک Delegate را فراهم می‌کند. در نتیجه، می‌توان چند عملیات را با یک فراخوانی اجرا کرد.

مناسب برای برنامه‌های رویداد محور

Event یکی از اجزای اصلی پیاده‌سازی برنامه‌های رویداد محور است. در این برنامه‌ها برای مدیریت اتفاقاتی نظیر کلیک کردن، تغییر وضعیت یا تکمیل عملیات از Event استفاده می‌شود.

محدودیت‌های Delegate و Event در سی شارپ

delegate و event با وجود مزایای بسیار محدودیت‌هایی نیز در برنامه ایجاد می‌کنند. در ادامه، مهم‌ترین محدودیت‌هایی استفاده از delegate و event در برنامه آورده شده است.

  • افزایش پیچیدگی کد
  • دشوار شدن دیباگ
  • اجرای ناخواسته چند متد
  • احتمال ایجاد نشت حافظه
محدودیت‌های Delegate و Event در سی شارپ در تصویر نشان داده شده است.
محدودیت‌های Delegate و Event در سی شارپ

افزایش پیچیدگی کد

استفاده زیاد از Delegate و Event می‌تواند ارتباط بین بخش‌های مختلف برنامه را پیچیده کند. در پروژه‌های بزرگ پیدا کردن اتصال بین متد و Event بسیار دشوار است.

دشوار شدن دیباگ

اجرای متدها از طریق Delegate یا Event باعث می‌شود تا مسیر اجرای برنامه همیشه به‌ صورت مستقیم مشخص نباشد. این موضوع باعث می‌شود تا خطایابی در برنامه دشوار شود.

اجرای ناخواسته چند متد

در یک delegate چندریختی ممکن است که چند متد به یک delegate متصل باشند. در نتیجه، با یک مرتبه فراخوانی ممکن است چند عملیات اجرا شوند که در صورت مدیریت نادرست، رفتار غیرمنتظره‌ای ایجاد می‌کند.

احتمال ایجاد نشت حافظه

در صورت مدیریت نادرست Event Handlerها ممکن است ارتباط بین اشیا برای مدت طولانی حفظ شود. در نتیجه، از آزاد شدن برخی اشیا توسط «جمع‌آوری کننده زباله» (Garbage Collector) جلوگیری می‌شود. در برنامه‌های بزرگ این موضوع می‌تواند باعث افزایش مصرف حافظه شود.

نکات مهم استفاده از delegate و event در سی شارپ

هنگام استفاده از Delegate و Event رعایت چند نکته ساده می‌تواند از پیچیده شدن کد و ایجاد خطاهای احتمالی جلوگیری کند که در ادامه این موارد آورده شده است.

  • استفاده از delegate با امضای مناسب
  • بررسی null بودن هنگام اجرای Event
  • عدم استفاده بیش از حد از delegate و event
  • حذف Eventهای غیر ضروری
  • توجه به ترتیب اجرای Multicast Delegate

استفاده از delegate با امضای مناسب

متد متصل شده به delegate باید از نظر نوع مقدار بازگشتی و پارامترها با delegate سازگار باشد.

در مثال بالا، متدShowMessage باMyDelegate سازگار است. زیرا، هر دو یک پارامتر از نوع رشته دریافت می‌کنند و مقدار بازگشتی نیز ندارند.

بررسی null بودن هنگام اجرای Event

گاهی اوقات ممکن است که هیچ متدی به Event متصل نشده باشد. بنابراین، بهتر است پیش از اجرا وجود Handler بررسی شود.

در مثال بالا، استفاده از عملگر? باعث می‌شود در صورت null بودن Event برنامه با خطا مواجه نشود.

عدم استفاده بیش از حد از delegate و event

استفاده از Delegate و Event برای عملیات‌های ساده توصیه نمی‌شود. زیرا، می‌تواند کد را پیچیده‌تر کند. بهتر است زمانی از Delegate و Event استفاده شود که واقعاً به Callback، مدیریت رویداد یا ارتباط بین بخش‌های مختلف برنامه نیاز باشد.

حذف Event های غیر ضروری

اگر یک Event Handler دیگر مورد نیاز نیست، بهتر است ارتباط آن با Event حذف شود.

این کار در برنامه‌های بزرگ می‌تواند از باقی ماندن ارتباط‌های غیرضروری و مشکلات احتمالی مربوط به حافظه جلوگیری کند.

توجه به ترتیب اجرای Multicast Delegate

در صورت اتصال چندین متد به یک delegate، متدها به ترتیب اضافه شدن فراخوانی می‌شوند. بنابراین، در صورتی که ترتیب اجرای عملیات اهمیت دارد، باید این موضوع در طراحی برنامه در نظر گرفته شود.

جمع‌بندی

در این مطلب از مجله فرادرس با مفهوم Delegate و Event در سی شارپ و کاربرد آن‌ها در برنامه‌ نویسی آشنا شدیم. ابتدا مفهوم Delegate، نحوه تعریف و استفاده از آن و قابلیت Multicast Delegate را بررسی کردیم. سپس با مفهوم Event و نحوه استفاده از آن آشنا شدیم و تفاوت میان Event و Delegate را توضیح دادیم. در ادامه نیز کاربردهای Delegate و Event، از جمله مدیریت رویدادها، اجرای Callback و ارتباط بین بخش‌های مختلف برنامه را بررسی کردیم.

در پایان نیز مزایا و محدودیت‌های Delegate و Event و نکات مهم هنگام استفاده از آن‌ها مورد بررسی قرار گرفت. آشنایی با این مفاهیم به درک بهتر برنامه‌نویسی رویدادمحور و استفاده از قابلیت‌های پیشرفته‌تر زبان برنامه نویسی سی‌ شارپ کمک می‌کند.

مطالب مجله فرادرس را در جستجوی گوگل سریع‌تر ببینید

بر اساس رای ۱ نفر
آیا این مطلب برای شما مفید بود؟
اگر پرسشی درباره این مطلب دارید، آن را با ما مطرح کنید.
منابع:
GeeksforGeeksGeeksforGeeks
PDF
مطالب مرتبط
نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *