PDA

View Full Version : سوال: instance ساختن delegate



mehdihadeli
یک شنبه 07 شهریور 1389, 21:39 عصر
در این کد در محلی که مشخص کردم یک instance به نام pc از delegate ساخته شده و با متدی مقدار دهی شده.خط بعد دوباره یک شی روی هیپ intialize کرده که pc به آن اشاره میکند
با این کار مگه شی قبلی که در heap ایجاد کردیم از بین نمیره؟

در کلاس ها هم میشه همچین کاری انجام داد؟


public delegate void printcallBack();

static void main()
{
PrintcallBack Pc;
Person p=new Person();
p.name="ali";
p.family="ahmadi";

pc=new printcallBack(p.print);/////////////////////////
pc+=new printcallBack(x.showInfo);

pc();
}

ali.aghdam
دوشنبه 08 شهریور 1389, 03:05 صبح
در اون قسمت که مشخص کردید شما در واقع یک Delegate رو به لیست Delegate دیگر (pc) اضافه می کنید که در هنگام Invoke شدن Delegate اول (pc) ،آدرس تابعی یا توابعی که Delegate دوم که در درون Delegate اول قرار دادید Invoke میشه!

و معادل والبته بهینه کد شمارو به صورت زیر نوشت

public delegate void printcallBack();

static void main()
{
PrintcallBack Pc;
Person p=new Person();
p.name="ali";
p.family="ahmadi";

pc=p.print;
pc+=x.showInfo;

pc();
}در اینجا در واقع شما عملوند =+ رو Overload می کنید.اگر امضاء توابع p.print و x.showInfo با Dlegate شما تفاوت داشت از عبارات Lambda استفاده کنید

pc+= (() => { x.showInfo});خوب درمورد ایجاد نمونه از Delegate هم باید بگم وقتی شما یک Delegate تعریف می کنید در واقع یک کلاس تعریف می کنید که از System.multicastDelegate مشتق میشه (اگه اشتباه نکنم این کار توسط کامپایلر انجام میشه) و کلاس MulticastDelegate درون خود یک لیست از آدرس توابعی که به اون اشاره می کنه رو نگهداری می کنه و وقتی شما عملوند =+ رو Ovreload می کنید ،یک نمونه از Delegate رو ایجاد نمی کنید بلکه آدرس یک تابع رو درون اون لیست برای Invoke شدن ،ذخیره می کند

در مورد سوال دوم هم اگر Overload عملوند =+ رو پیاده سازی کنید می توان چیزی شبیه به این رو پیاده سازی کرد (در صورتی که اصلا بهش نیاز نیست)

gwbasic
دوشنبه 08 شهریور 1389, 12:31 عصر
این تاپیک آموزش delegate هست
ببین مشکلتو با delegate حل می کنه
http://barnamenevis.org/forum/showthread.php?t=204974