ورود

نسخه کامل مشاهده نسخه کامل : delegate



hhojjatt
14-02-2010, 17:17
دوستان می خوام درباره delegate یاد بگیرم ممنون میشم راهنمایی کنید

_H2_
15-02-2010, 22:43
سلام
delegate ها اشاره گر توابع هستند.
یعنی آدرس شروع کدهای تابع را در RAM در خودش دارد.
در واقع میتوانید با delegate یک تابع را جابه جا کنید.

وقت توضیح کاملتر ندارم و به نظرم کد ساده نمونه زیر گویا است:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

دقت کنید که تابع Run یک اشاره گر تابع میگیرید و آن را در داخل خودش اجرا میکند ...
تابع F1 و F2 هم دو نمونه تابع مطابق الگوی امضای دیجیتال Name1 است که اشاره گرشان میتواند در متغییری از Name1 جا شود و یا منتقل شود.

موفق باشید.

Mehran NZ
16-02-2010, 02:15
سلام
بخوام به زبان ساده بگم delegate رو شما می تونید یک نوع کلاس در نظر بگیرید که فانکشنهایی که در یک کلاس هست(حالا هر تابعی در هر کلاسی که شکلش شبیه delegat ی هست که تعریف کردین) رو به آبجکتهایی که ازش ساخته می شن منتقل می کنه و دقت کنید که اون آبجکتها خودشون مثل فانکشن برخورد می کنن پس نمی شه گفت دقیقا مثل یک شی معمولی هستن!
اینم نمونه کد مثلا من می خوام تابع MyFunc که در کلاس Mehran وجود داره رو به تابع DelegatObj منتقل کنم و منظور از منتقل کردن این هست که دقیقا همون کار و برامون انجام بده :
توجه داشته باشید که public delegate void MehranDelegate(int x); مقدار void رو بر می گردونه و int می گیره و MyFunc هم دقیقا همین کار و می کنه که در غیر اینصورت نمی شد اینا دو تا رو به هم ربط داد!

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید


خوب حالا این یک نوع اضافه کردن یک تابع به یک delegate بود راه دیگش اینه که چندین تابع رو به یک delegate اضافه کنیم یعنی با یک delegate چند تابع یکجا اجرا بشن به این صورت:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

حالا می خوایم ببینیم که اصلا Delegate ها اصولا به چه دردی می خورن و چرا باید همچین کارهایی انجام بدیم!
ما از delegate ها برای ساخت event ها استفاده می کنیم این به این معنی هست که وقتی یک event اتفاق می افته این کار باید باعث بشه که یه تابعی از یه جایی اجرا بشه همون طور که خیلی راحت می شه حدس زد این تابع (یا تابعها) دقیقا همونی هستش که ما قبلا توی delegate رجیسترش کردیم!
مثلا فرض کنید یک جمله if در فلان کلاس اجرا شده و ما می خوایم با این کار یک تابع در یک کلاس دیگه اجرا بشه اینجاست که اون تابع رو در delegate قرار می دیم و یک Event از delegate درست می کنیم پس هر وقت که event اتفاق بیافته اون تابع اجرا می شه!
قبل از اینکه مثالی رو بیارم باید چند نکته جزئی رو بگم اول این که یک event باید حتما در یه کلاس ساخته بشه و کلا بصورت زیر ساخته می شه!

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

یک event رو هم باید مثل همون توابع یه دیلیگیت مربوطه اضافه کرد(این موضوع در مثال کاملا روشن می شه اگه الان نفهمیدین مشکلی نیست)


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

خوب اینم مثال ما یه کلاس داریم که event ایجاد می کنه و یه تابع هم در یه کلاس دیگه داریم که به محض اجرا شدن event عکس العمل نشون می ده و اجرا می شه


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

مثال بعدی هم همون قبلیه که فقط بجای اجرای یک تابع با یه event دو تابع با هم اجرا می شن(فکر کنم دیگه این و راحت خودتون بنویسید):

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

و نکته آخری که به ذهنم می رسه اینه که Visual Studio سر درست کردن event گیر میده که دکمه Tab رو بزنید تا خودش تابع فراخواننده event رو اجرا کنه در این صورت دیگه نیازی نیست تابعی رو به delegate نسبت بدیم می شه اینطوری(توجه کنید هیچ تابعی توی delegate رجیستر نشده پس دیگه به کلاس EventCatcher هم نیازی نیست):

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

Mehran NZ
04-04-2010, 03:14
خوب دوستان من نصف شبی زد به سرم و یه چیز درست و درمونی در موردش نوشتم و پستم و ادیت کردم باشد که بدرد یکی بخورد !
اساتید اگه نکته ای چیزی جا مونده یا اشتباهی جایی هست بفرمایید ما هم استفاده کنیم
آزاد باشید