السلام عليكــم ورحمـة الله وبركاتــه ،،
هذا الموضوع لتوضيح كيفية الاستفادة من الكائن delegate فهذا الكائن يمكن المبرمج من التحكم في سير الميثود أو إدخال ميثود كباراميتر لميثود أخرى وتكون صيغة التعريف كالتالي :
delegate <The method return data type > < object name> (<method parameters>);
مثال على ذلك :
delegate void myDelegate(int parm1, int parm2);
بعد أن تعرفنا على كيفية الإعلان عن هذا الكائن نأتي لاستخداماته وهي كالتالي :
الاستخدام الأول : مؤشر على ميثود معينة ذات صفات محددة
مثلا تريد ميثود من نوع int وتأخذ متغيرين من نوع int فما عليك إلا أن تعرف هذه الميثود كالتالي
delegate int myMethod(int parm1,int parm2);
يوجد مشروع في المرفقات به ما قمنا بشرحه
مثال كاملة على ذلك :
هذا المثال يقوم بتنقيح الأرقام السالبة عن الأرقام الموجبة
delegate bool IsAccepted(int number); //الاعلان عن الكائن delegate
int[] Inputnumbers = { 1, 0, -9, -6, 3, 6, -7, 4, -55, 2 };
int[] AcceptedNumbers(int[] numbers,IsAccepted method)
{
List<int> Accepted=new List<int>();
foreach (int number in numbers)
if (method.Invoke(number)) Accepted.Add(number);
return Accepted.ToArray();
}
bool IsPositiveNumber(int number)
{
return number > 0;
}
bool IsNegativeNumber(int number)
{
return number < 0;
}
int[] GetPositiveNumbers()
{
int[] positiveNumbers = AcceptedNumbers(Inputnumbers,
IsPositiveNumber); //لاحظ كيف أن الميثود أصبحت باراميتر
return positiveNumbers;
}
int[] GetNegativeNumbers()
{
int[] negativeNumbers = AcceptedNumbers(Inputnumbers,
IsNegativeNumber); //لاحظ كيف أن الميثود أصبحت باراميتر
return negativeNumbers;
}لاحظ أننا بدلنا فقط الباراميتر الثاني وحصلنا على نتائج مختلفة وذلك لأن الميثود AcceptedNumbers تقوم باستدعاء الميثود المدخلة في الباراميتر الثاني لكل عنصر في المصفوفة Inputnumbers فإذا كان ناتج الميثود true تقوم بإضافة العنصر إلى ال List وإذا كان الناتج false تقوم بتجاهل هذا العنصر.
قد تقول لماذا أعمل كل ذلك فكان بإمكاني تنفيذ هذا الكود بطرق معروفة سابقا
ولكن لا تتعجل فهذه الطرق أفضل بكثير لعدة أسباب منها :
1. قد لا تكون أنت الذي سيحدد هل هذا العنصر مطلوب أو لا.
2.هذه الطرق أفضل للبرمجة المتقدمة حيث أنها تساعد على فهم الكود بصورة أسرع وعلى إعادة تصليحه إذا حدث خطأ معين .
الى هنا نكون أنهينا الاستخدام الاول للكائن delegate
اذا رأيت اهنمام بالموضوع سأكمل استخدامات هذا الكائن وهي مفيدة جدا