PDA

View Full Version : delagate



dr_csharp
یک شنبه 11 فروردین 1387, 00:24 صبح
سلام
به مثال زیر توجه کنید :



public delegate int Calculate (int value1, int value2);
public int add(int value1, int value2)
{
return value1 + value2;
}
public int sub( int value1, int value2)
{
return value1 - value2;
}
MyClass mc = new MyClass();

Calculate add = new Calculate(mc.add);
Calculate sub = new Calculate(mc.sub);

Console.WriteLine("Adding two values: " + add(10, 6));
Console.WriteLine("Subtracting two values: " + sub(10,4));

مزیت استفاده ازDelegate در مثال فوق نسبت به حالتی که مستقیما از کلاس mc به متدهای add و sub دسترسی پیدا کنیم چیه ؟

sinpin
یک شنبه 11 فروردین 1387, 05:38 صبح
سلام
به مثال زیر توجه کنید :



public delegate int Calculate (int value1, int value2);
public int add(int value1, int value2)
{
return value1 + value2;
}
public int sub( int value1, int value2)
{
return value1 - value2;
}
MyClass mc = new MyClass();

Calculate add = new Calculate(mc.add);
Calculate sub = new Calculate(mc.sub);

Console.WriteLine("Adding two values: " + add(10, 6));
Console.WriteLine("Subtracting two values: " + sub(10,4));
مزیت استفاده ازDelegate در مثال فوق نسبت به حالتی که مستقیما از کلاس mc به متدهای add و sub دسترسی پیدا کنیم چیه ؟
هیچی ! چون تعریف و صدا زدن در یکجا انجام میشود و احتمالا فقط یک مثال ساده از نحوه ی کار با delegate ها بوده.

بصورت خلاصه :
یک delegate یک کلاس است که آبجکتهای تعریف شده از آن میتونند آدرس متودهایی با امضای مشخص از کلاسها و یا آبجکتهای دیگر رو در خود داشته باشد و در مواقع لزوم آنها را call کند.
برای مثال برای پیاده سازی ایونت از deleagte ها استفاده میشه چون مشخص نیست که اون متود کجا قراره صدا زده باشه اما امضای متود از قبل مشخص است.
مورد کاربرد دیگه میتونه برنامه های مالتی ترد باشه و ...

dr_csharp
یک شنبه 11 فروردین 1387, 10:05 صبح
هیچی ! چون تعریف و صدا زدن در یکجا انجام میشود و احتمالا فقط یک مثال ساده از نحوه ی کار با delegate ها بوده.پس در حالت عادی فراخوانی متد بصورت مستقیم با زمانیکه متد توسط delegate فراخوانی بشه فرق نداره ؟

برای مثال برای پیاده سازی ایونت از deleagte ها استفاده میشه چون مشخص نیست که اون متود کجا قراره صدا زده باشه اما امضای متود از قبل مشخص است.سینا جان ممکنه در این رابطه بیشتر توضیح بدی ؟

sinpin
یک شنبه 11 فروردین 1387, 10:20 صبح
1- دقیقا همینطوره - معمولا بین تعریف و اجرا کردن یک delegate فاصله ی مکانی هست.
2- مثلا کسانی که کلاس button رو نوشتند، delegate هایی رو نیز تعریف کردند تا زمانی که فرضا رویداد کلیک انجام شد متودی (ایونت هندلر) رو که شما در فرمتون نوشتید رو اجرا کنه:

private void button1_Click(object sender, EventArgs e)
{

} توجه داشته باشید که متودی که باید اجرا شود توسط شما نوشته میشود (و در زمان تعریف delegate ناشناخته بوده است) با این شرط که حتما باید مقدار خروجی آن void بوده و signature آن (object , EventArgs) باشد.