شما وقتی که بخواهید کد سفارشی ای بنویسید که هنگام برپا شدن یک رویداد فراخوانی شود، تعهد آن رویداد را که توسط کلاس های دیگر منتشر شده است را امضا می کنید. برای نمونه، ممکن است برای اینکه اپلیکیشن شما کار مفیدی را در مواقعی که کاربر روی دکمه "کلیک" کرد انجام دهد، تعهد رویداد click دکمه را امضا کنید.
امضای تعهد به رویدادها با استفاده از IDE ویژوال استودیو
- اگر نمی توانید پنجره Properties را ببینید، در نمای Design ، روی فرم یا کنترلی (دکمه ، تکست باکس و...) که می خواهید برایش استعمال کننده رویداد بسازید، راست کلیک کنید و گزینه Properties را انتخاب کنید.
- در بالاترین قسمت پنجره Properties روی آیکن Events (به شکل رعدوبرق) کلیک کنید.
- روی رویدادی که می خواهید بسازید (برای مثال رویداد Load) ، دوبار کلیک کنید.
ویژوال استودیو بصورت خودکار یک متد استعمال کننده (بصورت خالی و پیاده سازی نشده) رویداد را به کد شما اضافه می کند. به بیانی دیگر، شما می توانید همین کدها را بصورت دستی در نمای Code وارد کند. برای مثال، خطوط کد زیر یک متد استعمال کننده رویداد را اعلان می کنند که در هنگام برپا شدن رویداد Load از کلاس Form فراخوانی خواهد شد.
خطوطی از کد که برای تعهد دادن به رویداد مورد نیاز هستند نیز بصورت اتوماتیک تولید شده و در متد InitializeComponent واقع در فایل Form1.Designer.cs پروژه شما قرار گرفته اند. این کد شبیه کد زیر است:
امضای تعهد به رویدادها با برنامه نویسی
- یک متد استعمال کننده رویداد، که امضایش با امضای وکیل رویداد منطبق باشد را تعریف کنید. برای مثال، اگر رویداد، برپایه نوع وکالتی EventHandler است، کد زیر متد منطبق با آن را نشان می دهد:
void HandleCustomEvent(object sender, CustomEventArgs a)
{
// Do something useful here.
} - با استفاده از عملگر انتساب افزایش دهنده ( =+ ) ، استعمال کننده رویداد خود را به رویداد الحاق کنید. در مثال زیر، فرض کنید شیئ به نام Publisher دارای رویدادی به نام RaiseCustomEvent باشد. دقت کنید که کلاس تعهد کننده به یک مرجع به کلاس ناشر نیاز دارد تا بتواند به رویداده های آن، تعهد دهد.یک استعمال کننده رویداد را می توان با استفاده از یک عبارت لامبدا اضافه کرد:public Form1(){InitializeComponent();// Use a lambda expression to define an event handler.this.Click += (s,e) => { MessageBox.Show(((MouseEventArgs)e).Location.ToString());};}
امضای تعهد به رویدادها با استفاده از متدهای بی نام
- اگر در آینده مجبور به ترک تعهد به رویداد نخواهید بود، می توانید از عملگر انتساب افزایش دهنده ( =+ ) برای الحاق متد بی نام به رویداد استفاده کنید. در مثال زیر، فرض کنید که شیئی به نام Publisher دارای رویدادی به نام RaiseCustomEvent باشد و اینکه یک کلاس CustomEventArgs هم برای حمل کردن برخی اطلاعات اختصاصی شده رویداد ، تعریف شده باشد. توجه کنید که کلاس تعهد کننده به یک ارجاع به Publisher نیاز دارد برای اینکه بتواند به رویدادهای آن تعهد بدهد. توجه به این نکته مهم است که شما درصورت استفاده از تابع بی نام برای تعهد به رویداد ، نمی توانید بسادگی از تعهد آن رویداد خارج شوید. در این سناریو برای از تعهد خارج کردن، لازم است که به کدی که در آن به رویداد تعهد داده ایم برگردیم، متد بی نام را در یک متغیر وکالتی ذخیره کرده ، سپس آن وکیل را به رویداد اضافه کنیم. بطور کلی ، ما پیشنهاد می کنیم که اگر می خواهید در برخی نقاط بعدی کدتان از تعهد رویداد خارج شوید، از توابع بی نام برای تعهد به رویدادها استفاده نکنید.
خروج از تعهد
برای جلوگیری از فراخوانده شدن استعمال کننده رویداد در هنگام برپایی رویداد ، از تعهد رویداد خارج شوید. برای جلوگیری از نشتی های منابع، می بایستی قبل از اینکه شیئ متعهد را معزول (dispose) کنید ، از تعهد رویداد خارج شوید. تا زمانیکه از تعهد رویداد خارج شوید، وکیل چندپخشی ای که زیربنای رویداد در شیئ ناشر است یک ارجاع به وکیل تعهد کننده ی مربوط به استعمال کننده رویداد ، دارد. تا زمانیکه شیئ ناشر آن ارجاع را نگهداری می کند، زباله روب (GC) ، شیئ متعهد شما را حذف نخواهد کرد.
فسخ تعهد از یک رویداد
- برای فسخ تعهد از یک رویداد، از عملگر انتساب کاهنده ( =- ) بصورت زیر استفاده کنید:
publisher.RaiseCustomEvent -= HandleCustomEvent;
وقتی همه متعهد ها از تعهد به یک رویداد خارج شدند، نمونه ی رویداد در کلاس ناشر مقدار null به خود می گیرد.