در طی چند مقاله میخوام به Delegate ، ایونت و ارتباط بین این دو صحبت کنم.
Delegate قسمت اول:
Delegate ها را میتوان به عنوان یک جانگهدار هوشمند که رفرنسهایی را به چند متد نگه میدارد در نظر گرفت.اگر متدی بخواهد از طریق نمونه ای از یک Delegate فراخوانی شود باید در آن نمونه رجیستر شود. وقتی که رجیستر شد یک رفرنس به آن متد در مجموعه داخلی رفنسهای Delegate اضافه میشود که به آن Invocation List گفته میشود. Delegate ها میتوانند این مجموعه را بصورت همزمان یا غیر همزمان فراخوانی کنند. وقتی که یک Delegate فراخوانی شد همه متدهایی که در آن رفرنس دارند نیز اجرا میشوند.
Delegate ها نمیتوانند به هر متدی رفرنس داشته باشند بلکه باید signature متد با signature آن Delegate دقیقا یکی باشد.(signature به زبان ساده یعنی آرگومانها از نظر نوع و تعدا و همچنین مقدار برگشتی متد دقیقا یکسان باشد)
نحوه تعریف یک Delegate :
Delegate ها نمیتوانند به هر متدی رفرنس داشته باشند بلکه باید signature متد با signature آن Delegate دقیقا یکی باشد.(signature به زبان ساده یعنی آرگومانها از نظر نوع و تعدا و همچنین مقدار برگشتی متد دقیقا یکسان باشد)
نحوه تعریف یک Delegate :
public delegate void MyDelegate(string myString);
از این Delegate متوجه میشویم که Delegate فقط میتواند به متدهایی که یک آرگومان از نوع string میگیرند و همچنین هیچ مقدار بازگشتی ندارند رفرنس داشته باشد.مثال: Delegate میتواند از متد زیر رفرنس داشته باشد:
مثال: Delegate میتواند از متد زیر رفرنس داشته باشد
1 private void MyMethod(string someString)
2 {
3 // method body here.
4 }
اما نمیتواند از متدهای زیر رفرنس داشته باشد:
private string MyOtherMethod(string someString)
{
// method body here.
}
private void YetAnotherMethod(string someString, int someInt)
{
// method body here.
}
با استفاده از کده زیر میتوانیم از یک Delegate نمونه بگیریم و یک متد را به Invocation List آن اضافه کنیم:
MyDelegate del = new MyDelegate(MyMethod);
del += new MyDelegate(MyOtherMethod);
برای فراخوانی آن متد (و کل Invocation List ) کافیست بنویسیم:
del("my string value");
اما شاید این سوال در ذهن شما نقش ببندد که چرا Delegate استفاده میکنیم؟ میتوان جوای این سوال را اینگونه داد:
1) Delegate به عنوان یک جانگهدار: در اغلب موارد ما میدانیم چه متدی باید اجرا شود و چه کدی باید در یک زمان اجرا شود. یکی از مواردی که میتوان به آن اشاره کرد این است که آنها راه دیگری را برای اجرای کد شما توسط کامپوننتهای دات نت فراهم میکنند بدون اینکه چیزی جز signature متد را بدانند. به عنوان مثال کامپوننت تایمر برای ایونت Tick خود نیاز به یک متد دارد. کامپوننت تایمر در حقیقت نمیداند شما چه کدی را برای این ایونت بنویسید فقط signature آنرا میداند. بنابراین وقتی که این ایونت را نوشتید این ایونت به invocation list مربوط به Delegate ایونت Tick اضافه میشود و هنگام رخداد ایونت Tick آن Delegate فراخوانی میشود. بنابراین Delegate ما را قدر میسازد که کدهایی را بنویسیم که بعدا به آنها متد یا متدهایی اضافه شود.
2) فراخوانی همزمان و غیر همزمان: همه Delegate ها را میتوان همزمان و غیر همزمان فراخوانی کرد. فراخوانی غیر همزمان را میشود با استفاده از BeginInvoke و EndInvoke و فراخوانی همزمان را میتوان با Invoke انجام داد.
3) کاربرد Delegate در ایونتها: اگر خدا بخواد در ادامه در مورد ایونتها بحث خواهیم کرد در آنجا خواهید دید که Delegate ها پایه ایونتها هستند. در حقیقت Delegate ها به عنوان یک لایه بین منتشر کننده ایونت(Publisher) و گیرنده ایونت(Subscriber) خواهد بود. به این معنی که گیرندگان ایونت میتوانند به Invocation List آن Delegate اضافه شوند بدون اینکه منتشر کننده چیزی راجع به آنها بداند. به این ترتیب Publisher لازم نیست چیزی راجع به Subscriber ها بداند.
4) دیگر استفاده های Delegate که فعلا آنها را بررسی نمیکنیم
مرسی خوندم و به دردم خورد.
پاسخ دادنحذفمتاسفم که وبلاگ به این خوبی, فیلتر شده
ممنون از شما.امیدوارم این پیام رو ببینید.
extremum.persianblog.ir