Delegate چیست ؟
#1
Note 
در حالت معمولی می توان به یک متد یک متغییر را به عنوان پارامتر فرستاد.اما گاهی خوب است که اشیا متدها را به عنوان پارامتر به متدهای دیگر ارسال کرد.

Delegate ها در سی شارپ یکی از نقشهای مهم و کلیدی رو ایفا میکنند و با توجه با ماهیت اونا، امکانات متفاوتی رو در اختیار ما قرار میدن، از جمله، استفاده از آنها در MultiThread Application، Asynchronous Programming و Event Handling است.

و اما Delegate چیست ؟


delegate آبجکتی هست که رفرنسی از یک متد یا مجموعه ای از متدها رو در خودش نگه میداره. اما این مجموعه متدها بایستی از یک سری قوانین تبعیت کنند تا بتونن به لیست متدهایی که اون delegate بهشون اشاره میکنه اضافه بشن، به عبارت دیگه برای اینکه متدی به لیست Reference Method های یک delegate اضافه بشه باید با تعریف اون delegate هماهنگ باشه، به این هماهنگی و تطابق اصطلاحا امضا (Signature) میگن، پس مجوز ورود یک متد به لیست Reference Method یک delegate اینه که امضای اون متد با تعریف delegate مورد نظر یکی باشه، به این ترتیب که :

۱٫ نوع بازگشتی متد مورد نظر برابر با نوع بازگشتی مشخص شده در تعریف delegate باشه.
۲٫ نوع و تعداد پارامترهای ورودی متد مورد نظر برابر با نوع و تعداد پارامترهای ورودی مشخص شده در تعریف delegate باشه.

لازم به ذکر است که به لیست Reference Methods مربوط به یک delegate اصطلاحا Invocation List گفته میشود.

به تعریف delegate زیر نگاه کنید :

[CSHARP]public delegate void myDelegate(string argument); [/CSHARP]



طبق تعریف delegate مورد نظر، نام delegate ما myDelegate است و متدهایی را میتواند به Invocation List خود اضافه کند که :

۱٫ هیچ مقداری بر نگردانند.
۲٫ یک پارامتر از نوع string بگیرند.

به این متد نگاه کنید :

[CSHARP]private void myMethod(string msg)
{
// method body
} [/CSHARP]


همانطور که در کد بالا میبینید، امضای متد myMethod با تعریف myDelegate مطابقت دارد، پس این متد میتواند به Invocation List آبجکت myDelegate ما اضافه شود :
[CSHARP]
myDelegate del = new myDelegate(myMethod); [/CSHARP]


متد myMethod اولین متدی است که به Invocation List آبجکت myDelegate یعنی del اضافه میشود، برای اضافه کردن متدهای بیشتر بایستی به شیوه ی زیر عمل کنیم :
[CSHARP]
del += new myDelegate(myMethod2); [/CSHARP]

همچنین برای حذف یک متد از Invocation List یک آبجکت delegate میبایست به شیوه ی زیر عمل نماییم :
[CSHARP]del -= new myDelegate(myMethod2); [/CSHARP]
حال، این متد را در نظر بگیرید :
[CSHARP]private void myMethod3()
{
// method body
} [/CSHARP]

آیا این متد میتواند به Invocation List آبجکت del اضافه شود ؟ پاسخ منفی است، به دلیل اینکه امضای آن با امضای delegate اعلان شده ی ما مطابقت ندارد (هیچ پارامتری دریافت نمیکند).
حال اگر آبجکت delegate مورد نظر را Invoke کنیم، تمام متدهایی که در Invocation List آن موجود هستند اجرا میشوند، نحوه ی Invoke کردن یک آبجکت delegateمانند فراخوانی یک متد و ارسال پارامتر (در صورت نیاز) به آن میباشد :
[CSHARP]del(“my message value”); [/CSHARP]



چرا در Event ها از Delegate استفاده میکنیم ؟

اگر delegate، فراخوانی ساده ی یک متد به صورت غیر مستقیم است، پس چه نیازی هست که از delegate استفاده کنیم ؟
پاسخ این است، کامپوننتهایی که شامل رویداد های مختلفی هستند را در نظر بگیرید، در زمان تولید نرم افزار شما کنترلی را به فرمتون اضافه میکنید و در صورت لزوم، رویدادهای مختلف آن را مدیریت میکنید، زمانی که شما رویدادی رو Handle میکنید، در حقیقت متدی رو در Invocation List آبجکت delegate درون کنترلتون اضافه یا Register کردید، متدی شبیه متد زیر :

[CSHARP]class Program
{
delegate void myDelegate(string argument);
static void Main(string[] args)
{
myDelegate del = new myDelegate(myMethod);
del += new myDelegate(myMethod2);
del(“sample string value”);

Console.Read();
}

private static void myMethod(string msg)
{
Console.WriteLine(msg+” from myMethod”);
}

private static void myMethod2(string msg)
{
Console.WriteLine(msg + ” from myMethod2″);
}
} [/CSHARP]


کنترل شما، حقیقتا هیچ اطلاعی در مورد متد مورد نظر نداره، فقط میدونه که این متد با امضای تعریف Delegate درونی خودش مطابقت داره و به Invocation List اش اضافه شده و هر زمان که آبجکت delegate مورد نظر Invoke شد، اونو اجرا میکنه، در حقیقت شما با ایجاد یک متد Event Handler در سورس کدتون، اونو دارید به delegate درون کنترل مورد نظر پیوند میدید (با توجه به تطابق امضای متد با delegate) و آبجکت delegate مورد نظر بدون اینکه اطلاعی در مورد متدهای رجیستر شده در Invocation List اش داشته باشه، اونها رو به صورت غیر مستقیم در زمان Invoke شدن خودش اجرا میکنه. این مهمترین دلیل استفاده از delegate ها در مدیریت رویداد میتونه باشه.

ساختار درونی Delegate :
زمانی که شما delegate ای رو اعلان میکنید، کامپایلر C# با توجه به اعلان delegate شما، کلاسی رو به assembly خروجی اضافه میکنه که نام کلاس مورد نظر، برابر با نام delegate شما و متدهای کلاس مورد نظر دارای امضایی مطابق delegate شما میباشند، این کلاس از کلاسی به نام System.MulticastDelegate مشتق میشه و دارای متدهایی است که امضای اونا با delegate شما مطابقت داره (متدهایی با نام Invoke,BeginInvoke و EndInvoke) که متد Invoke برای Synchronous Invocation و BeginInvoke و EndInvoke هم برای Asynchronous Invocationبه کار برده میشوند. لازم به ذکر است که شما نمی توانید خودتان کلاسی رو از System.MulticastDelegate مشتق کنید، تنها کامپایلر C# مجاز به چنین کاری می باشد، به عبارت دیگه با اعلان یک delegate شما به کامپایلر C# میگویید که کلاسی رو طبق delegate تعریف شده ی شما از System.MulticastDelegate مشتق کنه.

اما علت نامی که برای System.MulticastDelegate در نظر گرفته شده (Multicast) اینه که، delegate میتونه ارجاع بیشتر از یک متد رو در خودش نگه داره، و در زمان Invoke شدن، تمام رفرنس های متدهایی که در Invocation List اش وجود دارد رو فراخوانی کنه.

شما میتونید delegate هایی که دارای امضاهای مشابه هستند رو با هم جمع کنید و در یک delegate جدید ذخیره نمایید، حاصل delegate ای خواهد شد که Invocation List آن برابر با مجموع Invocation Listهای delegate های جمع شده است، میتونید از delegate ها در برنامه های MultiThread استفاده کنید و یا اونها رو در Asynchronous Programming به کار ببرید .

mybbiran.com

***********
پاسخ
ایجاد موضوع جدید   پاسخ به موضوع  

موضوعات مرتبط با این موضوع...
موضوع نویسنده پاسخ بازدید آخرین ارسال
Note اصلاح لیست فعالیت براساس روابط اولویتی afsane/68 0 335 15-06-2015 ساعت 10:48
آخرین ارسال: afsane/68
Note بزرگترین و کوچکترین شماره یک آیتم تکراری در لیست باکس exe 7 1,067 29-04-2014 ساعت 20:14
آخرین ارسال: Microsoft Man
Note بدست آوردن لیست تمامی فونتهای نصب شده xMAN 0 302 10-12-2013 ساعت 19:42
آخرین ارسال: xMAN
Note پیدا کردن بیشترین آیتم تکرار شده در یک لیست exe 2 673 24-11-2013 ساعت 18:59
آخرین ارسال: exe
Note سی شارپ - شمارش اعداد تکرار شده در لیست باکس exe 3 775 13-11-2013 ساعت 16:02
آخرین ارسال: Daniel
Note سوال IEnumerator چیست و به چه دردی میخوره ؟ سی شارپ The Arrow 1 841 16-09-2013 ساعت 08:33
آخرین ارسال: Ali Developer
Note Dictionary در سی شارپ چیست ؟ The Arrow 1 969 27-08-2013 ساعت 09:34
آخرین ارسال: Daniel
Note سوال ArrayList چیست ؟ سی شارپ The Arrow 1 922 27-07-2013 ساعت 08:12
آخرین ارسال: Stack OverFlow
Note سوال نشان دادن تعداد آیتم های چک شده در لیست باکس سی شارپ The Arrow 3 947 24-07-2013 ساعت 10:32
آخرین ارسال: Daniel
Note سوال : User Control در سی شارپ چیست و به چه دردی میخوره؟ The Arrow 5 1,178 12-07-2013 ساعت 14:08
آخرین ارسال: xMAN

کاربرانِ درحال بازدید از این موضوع:   1 مهمان