Why Delegates
- ستستخدم Delegates فى تدعيم وتشغيل ال Event
- الافضل انة يعطيك القدرة على مناداة Method لم تحددة وقت التصميم
ببساطة ال Delegates يقوم ب encapsulate ال Method فهو مؤشر لها ويمكنك مناداتها عن طريقة
وعلى الرغم ان ال Method ليست object لكنها ذات physical location فى الذاكرة وهذا ما يعطينا القدرة على التأشير عليها .
لتعريف الDelegates
delegate return-type name(Parameter-list);
يرجى مرعاة ان Return Type يجب ان يكون نفسة المستخدم مع ال Method محل التأشير وكذلك ال Parameter list
مثال:
لو افترضنا ان دى ال Method الى عايزين نعملها Delegate
public static string RemoveSpace(string s)
{
string Ts = "";
for (int i = 0; i < s.Length; i++)
{
if (s != ' ') Ts += s;
}
return Ts;
}لاحظ ال Return Type و ال Parameter
هيكون ال Delegate بالشكل دة
public delegate string de(string s);
هننشأ ال Object بتاع ال Delegate ونعطية البارمتر الى هو ال Method ونعملة Invoke
private void button26_Click(object sender, EventArgs e)
{
de Myde = new de(RemoveSpace);
MessageBox.Show(Myde.Invoke(" I Love C# So Much"));
}خصائص--
-Method Group Conversion
الخاصية دى اضيفت مع C# 2.0 ومعناها ببساطة ادخال اسم ال Method مباشرة الى ال Delegate Name بدون استخدام new
private void button26_Click(object sender, EventArgs e)
{
de Myde = RemoveSpace;
MessageBox.Show(Myde.Invoke(" I Love C# So Much"));
}-Multicasting
الخاصية دى معناها انك تقدر تضيف اكتر من Method لنفس ال Delegate مدام لهم نفس ال Return type و ال Parameters عن طريق +=
private void button29_Click(object sender, EventArgs e)
{
//Method Name RemoveSpaceMulticasting
devoid Myde = RemoveSpaceMulticasting;
Myde += dg.replaceSpacesMulticasting;
Myde("I Love C# SO Much");
Myde -= dg.RemoveSpaceMulticasting;
Myde("I Love C# SO Much");
}-Anonymous Methods
احياناً بتعمل Method خصيصاً للتأشير عليها لإرسال ال Delegate مثلاً ك Parameter ل Method اخرى او للاستفادة من Synchronization
ماذا لو قلت لك انة يمكنك تعريف ال Method الى جوار الموشر مباشرة
بإستخدام كلمة delegate ثم البارمتر ويلهم جسم الMethod نفسها وبعد غلق الاقواس ;
delegate(string s)
{};والكود
public delegate string deAnonymous(string s);
private void button30_Click(object sender, EventArgs e)
{
deAnonymous dg = delegate(string s)
{
string Ts = "";
for (int i = 0; i < s.Length; i++)
{
if (s != ' ') Ts += s;
}
return Ts;
};
MessageBox.Show(dg.Invoke("I Love C# So Much"));
}-Covariance and Contravariance
قلنا من قبل ان ال Return type بتاع ال Delegate لازم يكون مثل بتاع ال Method لكن الخاصية دى بغير الموقف شوية يعنى ممكن يكون Return بتاع ال Method يكون Drived Class من ال Return بتاع ال Delegate
فى آمان الله
