PDA

View Full Version : مبتدی: Delegate چیست و چه کاربردی دارد ؟



MSN_Issue
چهارشنبه 31 شهریور 1389, 17:58 عصر
سلام به همه
یه مدت بود که این Delegate زیاد به چشمم می خورد اما نمی دونستم چیه !!:گریه:
به مقدار زیاد توی این سایت و کل نت سرچ زدم اما چیز زیادی دستگیرم نشد (شاید سرچم حرفه ای نبوده !:افسرده:)
به هر حال ...
می خواستم ببینم کسی از دوستان میتونه یه توضیح کوچک در رابطه با اون(Delegate) بهم بده و اینکه کجا کاربرد داره ... ؟

اگه بشه با یه مثال ساده باشه خیلی ممنون میشم ...:بوس:

manij_mhm
چهارشنبه 31 شهریور 1389, 18:45 عصر
سلام.
کاربرد delegate وارد کردن یک متد به عنوان پارامتر به متد دیگریست.
یک شی از گونه delegate در واقع اشاره گری به تابعی می تواند باشد که دارای همان پارامتر و نوع بازگشتی است.
مثال:


private delegate string getstring();
static void main(){
int x=40;
getstring firststringmethod= new getstring(x.Tostring);
console.write(firststringmethod());
}


مثال بالا به تابع tostring اشاره شده.
البته
firststringmethod() با
firststringmethod.Invoke()
و
getstring firststringmethod= new getstring(x.Tostring) با
getstring firststringmethod= x.tostring
هم ارزند.
البته می تونید نام چندتا تابع رو داخل یک delegate قرار بدید تا پشت سرهم اجرا بشن. در این صورت باید مقدار بازگشتی تابع ها void باشند.

این اطلاعاتی بود که من در موردش داشتم.
موفق باشید.

babakghni
چهارشنبه 31 شهریور 1389, 18:56 عصر
من از يه سايت اين مطلب رو پيدا كردم:


(http://cslearning.tripod.com/cs/compCs_3_1.htm#top)
Delegate
Delegate ها، يكي ديگر از انواع مرجعي زبان C#‎ هستند كه با استفاده از آنها مي‌توانيد مرجعي به يك متد داشته باشيد، بدين معنا كه delegate ها، آدرس متدي خاص را در خود نگه ميدارند. در صورتيكه قبلاً با زبان C برنامه‌نويسي كرده‌ايد، حتماً با اين مفهوم آشنايي داريد. در زبان C اين مفهوم با اشاره‌گرها (pointer) بيان مي‌شود. اما براي افرادي كه با زبانهاي ديگري برنامه‌نويسي مي‌كرده‌اند و با اين مفهوم مانوس نيستند، شايد اين سوال مطرح شود كه چه نيازي به داشتن آدرس يك متد وجود دارد. براي پاسخ به اين سوال اندكي بايد تامل نماييد.
بطور كلي مي‌توان گفت كه delegate نوعي است شبيه به متد و همانند آن نيز رفتار مي‌كند. در حقيقت delegate انتزاعي (Abstraction) از يك متد است. در برنامه‌نويسي ممكن است به شرايطي برخورد كرده باشيد كه در آنها مي‌خواهيد عمل خاصي را انجام دهيد اما دقيقاً نمي‌دانيد كه بايد چه متد يا شي‌ءاي را براي انجام آن عمل خاص مورد استفاده قرار دهيد. در برنامه‌هاي تحت ويندوز اين گونه مسائل مشهودتر هستند. براي مثال تصور كنيد در برنامه‌ شما، دكمه‌اي قرار دارد كه پس از فشار دادن اين دكمه توسط كاربر شيءاي يا متدي بايد فراخواني شود تا عمل مورد نظر شما بر روي آن انجام گيرد. مي‌توان بجاي اتصال اين دكمه به شيء يا متد خاص، آنرا به يك delegate مرتبط نمود و سپس آن delegate را به متد يا شيء خاصي در هنگام اجراي برنامه متصل نمود.
ابتدا، به نحوه استفاده از متدها توجه نماييد. معمولاً، براي حل مسايل خود الگوريتم‌هايي طراحي مي‌نائيم كه اين الگوريتمهاي كارهاي خاصي را با استفاده از متدها انجام مي‌دهد، ابتدا متغيرهايي مقدار دهي شده و سپس متدي جهت پردازش آنها فراخواني مي‌گردد. حال در نظر بگيريد كه به الگوريتمي نياز داريد كه بسيار قابل انعطاف و قابل استفاده مجدد (reusable) باشد و همچنين در شرايط مختلف قابليت‌هاي مورد نظر را در اختيار شما قرار دهد. تصور كنيد، به الگوريتمي نياز داريد كه از نوعي از ساختمان داده پشتيباني كند و همچنين مي‌خواهيد اين ساختمان داده را در مواردي مرتب (sort) نماييد، بعلاوه ميخواهيد تا اين ساختمان داده از انواع مختلفي تشكيل شده باشد. اگر انواع موجود در اين ساختمان داده را ندانيد، چكونه مي‌خواهيد الگوريتمي جهت مقايسه عناصر آن طراحي كنيد؟‌ شايد از يك حلقه if/then/else و يا دستور switch براي اين منظور استفاده كنيد، اما استفاده از چنين الگوريتمي محدوديتي براي ما ايجاد خواهد كرد. روش ديگر، استفاده از يك واسط است كه داراي متدي عمومي باشد تا الگوريتم شما بتواند آنرا فراخواني نمايد، اين روش نيز مناسب است، اما چون مبحث ما در اين درس delegate ها هستند، مي‌خواهيم مسئله را از ديدگاه delegate ها مورد بررسي قرار دهيم. روش حل مسئله با استفاده از آنها اندكي متفاوت است.
روش ديگر حل مسئله آنست كه،‌ مي‌توان delegate ي را به الگوريتم مورد نظر ارسال نمود و اجازه داد تا متد موجود در آن،‌عمل مورد نظر ما را انجام دهد. چنين عملي در مثال 1-14 نشان داده شده است.
(به صورت مسئله توجه نماييد : ميخواهيم مجموعه‌اي از اشياء را كه در يك ساختمان داده قرار گرفته‌اند را مرتب نمائيم. براي اينكار نياز به مقايسه اين اشياء با يكديگر داريم. از آنجائيكه اين اشياء از انواع (type) مختلف هستند به الگوريتمي نياز داريم تا بتواند مقايسه بين اشياء نظير را انجام دهد. با استفاده از روشهاي معمول اين كار امكان پذير نيست، چراكه نمي‌توان اشيائئ از انواع مختلف را با يكديگر مقايسه كرد. براي مثال شما نمي‌توانيد نوع عددي int را با نوع رشته‌اي string مقايسه نماييد. به همين دليل با استفاده از delegate ها به حل مسئله پرداخته‌ايم. به مثال زير به دقت توجه نماييد تا بتوانيد به درستي مفهوم delegate را درك كنيد.)


(http://cslearning.tripod.com/cs/compCs_3_1.htm#top)
مثال : اعلان و پياده‌سازي يك delegate

using System;

// در اينجا اعلان مي‌گردد. delegate

public delegate int Comparer(object obj1, object obj2);

public class Name

{

public string FirstName = null;

public string LastName = null;

public Name(string first, string last)

{

FirstName = first;

LastName = last;

}

// delegate method handler

public static int CompareFirstNames(object name1, object name2)

{

string n1 = ((Name)name1).FirstName;

string n2 = ((Name)name2).LastName;

if (String.Compare(n1, n2) > 0)

{

return 1;

}

else if (String.Compare(n1, n2) < 0)

{

return -1;

}

else

{

return 0;

}

}

public override string ToString()

{

return FirstName + " " + LastName;

}

}



class SimpleDelegate

{

Name[] names = new Name[5];

public SimpleDelegate()

{

names[0] = new Name("Meysam", "Ghazvini");

names[1] = new Name("C#‎", "Persian");

names[2] = new Name("Csharp", "Persian");

names[3] = new Name("Xname", "Xfamily");

names[4] = new Name("Yname", "Yfamily");

}

static void Main(string[] args)

{

SimpleDelegate sd = new SimpleDelegate();

// delegate ساخت نمونه‌اي جديد از

Comparer cmp = new Comparer(Name.CompareFirstNames);

Console.WriteLine("\nBefore Sort: \n");

sd.PrintNames();



sd.Sort(cmp);

Console.WriteLine("\nAfter Sort: \n");

sd.PrintNames();

}



public void Sort(Comparer compare)

{

object temp;

for (int i=0; i < names.Length; i++)

{

for (int j=i; j < names.Length; j++)

{

//همانند يك متد استفاده مي‌شود compare از

if ( compare(names[i], names[j]) > 0 )

{

temp = names[i];

names[i] = names[j];

names[j] = (Name)temp;

}

}

}

}

public void PrintNames()

{

Console.WriteLine("Names: \n");

foreach (Name name in names)

{

Console.WriteLine(name.ToString());

}

}

}
اولين اعلان در اين برنامه، اعلان delegate است. اعلان delegate بسيا رشبيه به اعلان متد است، با اين تفاوت كه داراي كلمه كليدي delegate در اعلان است و در انتهاي اعلان آن ";" قرار مي‌گيرد و نيز پياده‌سازي ندارد. در زير اعلان delegate كه در مثال آورده شده را مشاهده مي‌نماييد :
public delegate int Comparer(object obj1, object obj2);
اين اعلان، مدل متدي را كه delegate مي‌تواند به آن اشاره كند را تعريف مي‌نمايد. متدي كه مي‌توان از آن بعنوان delegate handler براي Comparer استفاده نمود، هر متدي مي‌تواند باشد اما حتماً بايد پارامتر اول و دوم آن از نوع object بوده و مقداري از نوع int بازگرداند. در زير متدي كه بعنوان delegate handler در مثال مورد استفاده قرار گرفته است، نشان داده شده است :
public static int ComparerFirstNames(object name1, object name2)
{

}
براي استفاده از delegate مي‌بايست نمونه‌اي از آن ايجاد كنيد. ايجاد نمونه جديد از delegate همانند ايجاد نمونه‌اي جديد از يك كلاس است كه به همراه پارامتري جهت تعيين متد delegate handler ايجاد مي‌شود :
Comparer cmp = new Comparer(Name.ComparerFirstName);
در مثال ، cmp بعنوان پارامتري براي متد Sort() مورد استفاده قرار گرفته است.به روش ارسال delegate به متدSort() توجه نماييد :
sd.Sort(cmp);
با استفاده از اين تكنيك، هر متد delegate handler به سادگي در زمان اجرا به متد Sort() قابل ارسال است. براي مثال مي‌توان handler ديگري با نام CompareLastNames() تعريف كنيد، نمونه جديدي از ‍Comparer را با اين پارامتر ايجاد كرده و سپس آنرا به متد Sort() ارسال نماييد.

میلاد قاضی پور
چهارشنبه 31 شهریور 1389, 19:10 عصر
چیزی که من بعد از مطالعه فراوان از دلگیت برداشت کردم که ممکنه به درد شما هم بخوره همین یک جمله هست. دلگیت مثل قالب یا خشابی هست که از متدهای هم ریخت(نوع و پارامترهای مشابه) پر میشه و همشون رو اجرا میکنه .متدهایی که به دلگیت اضافه میشن سورت نمیشن بنابراین مشخص نخواهد بود کدام متد کی اجرا میشه. سوألی که پیش میاد اینه که به چه دردی میخوره ؟ تحقیقات دانشمندان در این مورد هنوز ادامه داره اما نظریه پردازان معتقدند ممکنه در خیلی جاها مثل تعریف ایونت ها و .. کارها رو تسهیل کنه .
البته این تمام چیزی هست که من در مورد دلگیت ها میدونم اما خوشحال میشم دوستان در تفهیم عمیق تر و بیشتر این موضوع تلاش کنند . مبحث دلگیت فوق العاده مهم هست .

uthman
سه شنبه 11 تیر 1392, 17:40 عصر
سلام .خدایش خیلی خوب توضیح دادی اگه چیزه دیگه ای میدونی در مورد delegate لطفا بذار.ممنون

ahmad156
سه شنبه 11 تیر 1392, 18:03 عصر
http://barnamenevis.org/showthread.php?117839-Custom-Event-Handling-in-C-Part1-Delegates

uthman
سه شنبه 11 تیر 1392, 18:06 عصر
http://barnamenevis.org/showthread.php?23992-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-Delegate-%D8%AF%D8%B1-C&highlight=delegate
salam be in link bro.

tooraj_azizi_1035
سه شنبه 11 تیر 1392, 19:53 عصر
دلگیت اضافه میشن سورت نمیشن بنابراین مشخص نخواهد بود کدام متد کی اجرا میشه.
ترتیب اجرای Delegate ها وقتی به شکل زنجیر وار به هم متصل میشن معلومه یکی پس از دیگری اجرا می شود:


using System;

// Define a custom delegate that has a string parameter and returns void.
delegate void CustomDel(string s);

class TestClass
{
// Define two methods that have the same signature as CustomDel.
static void Hello(string s)
{
System.Console.WriteLine(" Hello, {0}!", s);
}

static void Goodbye(string s)
{
System.Console.WriteLine(" Goodbye, {0}!", s);
}

static void Main()
{
// Declare instances of the custom delegate.
CustomDel hiDel, byeDel, multiDel, multiMinusHiDel;

// In this example, you can omit the custom delegate if you
// want to and use Action<string> instead.
//Action<string> hiDel, byeDel, multiDel, multiMinusHiDel;

// Create the delegate object hiDel that references the
// method Hello.
hiDel = Hello;

// Create the delegate object byeDel that references the
// method Goodbye.
byeDel = Goodbye;

// The two delegates, hiDel and byeDel, are combined to
// form multiDel.
multiDel = hiDel + byeDel;

// Remove hiDel from the multicast delegate, leaving byeDel,
// which calls only the method Goodbye.
multiMinusHiDel = multiDel - hiDel;

Console.WriteLine("Invoking delegate hiDel:");
hiDel("A");
Console.WriteLine("Invoking delegate byeDel:");
byeDel("B");
Console.WriteLine("Invoking delegate multiDel:");
multiDel("C");
Console.WriteLine("Invoking delegate multiMinusHiDel:");
multiMinusHiDel("D");
}
}
/* Output:
Invoking delegate hiDel:
Hello, A!
Invoking delegate byeDel:
Goodbye, B!
Invoking delegate multiDel:
Hello, C!
Goodbye, C!
Invoking delegate multiMinusHiDel:
Goodbye, D!
*/




سوألی که پیش میاد اینه که به چه دردی میخوره ؟شما تا قبل از آمدن Delegate ها نمی تونستید خود یک تابع یا متد رو به عنوان پارامتر به تابع یا متدی دیگر ارسال کنید.
مثال:



using System;
using System.Drawing;

public class Example
{
public static void Main()
{
// Create an array of Point structures.
Point[] points = { new Point(100, 200),
new Point(150, 250), new Point(250, 375),
new Point(275, 395), new Point(295, 450) };

// Find the first Point structure for which X times Y
// is greater than 100000.
Point first = Array.Find(points, x => x.X * x.Y > 100000 );

// Display the first structure found.
Console.WriteLine("Found: X = {0}, Y = {1}", first.X, first.Y);
}
}
// The example displays the following output:
// Found: X = 275, Y = 395


منبع: http://msdn.microsoft.com/en-us/library/bfcke1bz.aspx

sam.iran67
جمعه 14 تیر 1392, 01:53 صبح
آموزش تصویری-فارسی delegate ها در http://learningtv.ir

ret_ie
چهارشنبه 09 مرداد 1392, 01:16 صبح
چیزی که من بعد از مطالعه فراوان از دلگیت برداشت کردم ... سوألی که پیش میاد اینه که به چه دردی میخوره ؟ ... .
من تو C# خیلی خبره نیستم. اما از مفهوم هم ارز delegate تو دلفی (آدرس پروسیجر) خیلی استفاده کردم. البته نه اینکه عدم استفاده ازش کار رو کلا لنگ کنه. اما یه جاهایی واقعا به درد میخوره و در مجموع قابلیت استفاده مجدد از کد رو بیشتر میکنه و به پروژه یه ظاهر تر و تمیز میده.
مثلا تو یه پروژه در یک فرم گزارش گیری 25-26 تا دکمه بود که کاربر با کلیک هر کدوم میخواست یک سری عملیات مشابه (و نه یکسان) رو انجام بده.
بعضی چیزا رو تا آدم نیاز پیدا نکنه نمیتونه واسشون فایده ای تصور کنه...

mori2008
جمعه 17 مهر 1394, 09:08 صبح
فیلم آموزشی دلیگیت به زبان فارسی (http://tamr.in/product/%D9%88%DB%8C%D8%AF%DB%8C%D9%88-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D9%81%D8%A7%D8%B1%D8%B3%DB%8C-%D8%AF%D9%84%DB%8C%DA%AF%DB%8C%D8%AA-delegate)

سرفصل ها :


Delegate چیست و چگونه کار می کند؟
ارتباط Delegate با متدها چگونه است؟
مثال های مناسب برای یادگیری Delegate چگونه هستند؟
UI Thread چیست و چگونه مدیریت می شود؟
چرا کار کردن با Serial Port در برخی جاها به Delegate نیاز دارد؟
Func چیست؟
Action چیست؟
ارتباط Func و Action با دلیگیت چیست؟
عبارات لامبدا(LAMBDA) از کجا آمده اند و چگونه کار می کنند؟
رویداد(Events) چیست و چگونه کار میکند؟

shayanrad
سه شنبه 09 شهریور 1395, 09:04 صبح
امیدوارم این لینک کمکتون کنه: http://barnamenevis.org/showthread.p...light=delegate (http://barnamenevis.org/showthread.php?23992-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-Delegate-%D8%AF%D8%B1-C&highlight=delegate)

hamid_hr
سه شنبه 09 شهریور 1395, 10:53 صبح
خیلی تایپیک قدیمی هست دیگه
یه چیز دیگه این کاربر زده محروم شده چطور پست گذاشتن؟:متفکر: