طبیعتا اگر با سی شارپ و بخصوص در محیط Windows Form Applications کار کرده باشید، با رویدادها سر و کار داشتهاید و مواردی مثل event ها را دیدهاید. برای مثال، دکمهای را برروی فرم خود درگ میکنید و سپس با دوبار کلیک برروی آن، به رویداد کلیک شدن این دکمه منتقل میشوید؛ که یک متد خاصی بوده و ورودیهایی را دریافت میکند.
اما سوال اینجاست که چطور و چگونه میتوانیم برای مثلا یک کلاسی که نوشتیم، قابلیت رویداد نیز قرار دهیم!
مراحل کار
کلاس زیر را در نظر بگیرید:
1 2 3 4 5 6 7 8 9 |
public class FuLLKade { public void Test(string str) { Console.WriteLine(str); } } |
فرض کنید قصد داریم تا هر موقع متد Test با ورودی salam فراخوانی شد، رویدادی اجرا شود؛ اما بیایید ابتدا خود این رویداد را تعریف کنیم:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public class FuLLKade { public delegate void MyEventHandler(); public event MyEventHandler SalamEvent; public void Test(string str) { if (str.Equals("salam") && SalamEvent != null) SalamEvent(); Console.WriteLine(str); } } |
گفتیم که یک delegate به نام MyEventHandler داریم که هیچ ورودیای دریافت نکرده و خروجی نیز ندارد! در واقع delegate ها، متدهای بدون بدنه هستند و تنها ساختار متدی را تعریف کردهایم. حالا در ادامه، گفتیم که یک event یا همان رویداد، از نوع delegate ای که تعریف کردیم، در اختیار داریم و نام آن را SalamEvent قرار دادیم.
در ادامه و داخل متد Test، ورودی را بررسی میکنیم که اگر برابر salam بود و همچنین، رویداد SalamEvent مقداردهی شده بود، آن را اجرا کند. حالا بیایید یک آبجکتی از این کلاس بسازیم و آن را آزمایش کنیم:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
class Program { static void Main(string[] args) { FuLLKade fullkade = new FuLLKade(); fullkade.SalamEvent += new MyEventHandler(FuLLKade_SalamEvent); fullkade.Test("salam"); fullkade.Test("bye"); Console.ReadKey(); } public static void FuLLKade_SalamEvent() { Console.WriteLine("Event Salam"); } } |
خروجی:
salam
bye
به همین سادگی!
1. از آنجایی که متد Main بهصورت استاتیک میباشد، مجبور شدیم تا متد رویداد را نیز بهصورت استاتیک تعریف کنیم.
2. میتوانید برای delegate های خود، خروجی و ورودی تایین کنید؛ سپس از آن در رویدادهای متنوعی استفاده کنید.
3. میتوانید از سایر delegate های آماده نیز استفاده کنید. مثلا در ویندوز فرم اپلیکیشنها، چیزی به نام System.EventHandler وجود دارد.
4. میتوانید بهجای new کردن delegate در هنگام مقداردهی رویداد، فقط نام متد را قرار دهید.
5. اگر از ویژوال استودیو استفاده میکنید، پس از نوشتن علاوه مساوی مقابل رویداد، میتوانید Tab را بزنید تا پیادهسازی بهصورت خودکار انجام شود.
6. نام گذاری FuLLKade_SalamEvent اجباری نبوده و فقط یک نوع قواعد نامگذاری است.
7. شما میتوانید با منها مساوی نیز رویدادی را حذف کنید؛ اما در این صورت به آبجکتِ delegate ای که new کردهاید، نیاز خواهید داشت. البته به کمک اسم متدِ پیادهسازی شده مثل FuLLKade_SalamEvent نیز میتوانید آن را حذف کنید.
8. میـوانید از یک متد پیادهسازی شده مثل FuLLKade_SalamEvent، برای چندین delegate و رویداد دیگر استفاده کنید.
9. میتوانید برای یک رویداد، تعداد زیادی متد تعیین کنید؛ که در نتیجه، به ترتیب زمان اضافه شدنشان، یکی پس از دیگری اجرا خواهند شد.
10. فقط از علاوهمساوی و منهامساوی میتوانید جهت تخصیص رویداد جدید و حذف آن استفاده کنید و نمیتوانید از مساوی خالی استفاده کنید.
واقعا ممنون خیلی ساده و کاربردی عالییی
موفق باشید 🙏🏻