برمجة متقدمة سي شارب ماهو التفويض C# - Delegates
برمجة متقدمة سي شارب ماهو التفويض C# - Delegates
التفويض delegate |
ماهو التفويض C# Delegates
التفويض Delegate عبارة عن كائن يقوم بمهمة المؤشرات في السي بلس بلس ولغة السي فهو نوع بيانات ذات القيمة المرجعية يشير الى دالة اي مرجع للدالة.بمعنى أخر هو متدوب أو مفوض للدالة فبدلا من أن يقوم البرنامج مناداة الدالة فان المفوض أو التفويض delegate هو من يقوم من مناداة الدالة بطريقة غير مباشرة.يستخدم التفويض delegate مع الاحداث والدوال التي يتم استدعاءها عكسيا اي الى الوراء call-back methods.
شروط تعريف التفويض delegate
1- لتعريف التفويض delegate يجب تحديد نوع البيانات التي سوف تعيدها الدالة المراد تعريف تفويض delegate لها وهنا نقصد نوع صحيح او نصي او void الى أخره.
2- لتعريف التفويض delegate يجب أيضا تحديد عدد الباراميترات ونوعها المراد تمريرها عبر الدالة أي بمعني يجب أن تكون باراميترات التفويض delegate مطابقة لباراميترات الدالة المراد تطبيق عليها التفويض delegate.
خذ على سبيل المثال التفويض delegate التالي.
public delegate int MyDelegate (string s);
الصيغة العامة لتعريف التفويض delegate
delegate <نوع البيانات> <اسم التفويض> <الباراميترات>
تهئية التفويض delegate
بمجرد ان تم انشاء التفويض delegate فيجب عندها يجب تهئية التفويض delegate باستخدام الكلمة المحجوزة new.
اي بمعنى انشاء مثيل للتفويض delegate.
public delegate void printString(string s); ... printString ps1 = new printString(WriteToScreen); printString ps2 = new printString(WriteToFile);
مثال على التفويض delegate
في المثال التالي انشاءنا التفويض delegate للدالة بالمرجع بحيث تأخد باراميتر لعدد صحيح وتعيد لنا قيمة لعدد صحيح.
using System; delegate int NumberChanger(int n); namespace DelegateAppl { class TestDelegate { static int num = 10; public static int AddNum(int p) { num += p; return num; } public static int MultNum(int q) { num *= q; return num; } public static int getNum() { return num; } static void Main(string[] args) { //انشاء مثيلات التفويض NumberChanger nc1 = new NumberChanger(AddNum); NumberChanger nc2 = new NumberChanger(MultNum); //استدعاء الدوال عن طريق التفويض nc1(25); Console.WriteLine("Value of Num: {0}", getNum()); nc2(5); Console.WriteLine("Value of Num: {0}", getNum()); Console.ReadKey(); } } }
ناتج مثال التفويض delegate
Value of Num: 35 Value of Num: 175
التفويض البث او الارسال المتعدد multicasting delegate
يمكن جمع التفويض delegate مع المشغل + بحيث يصبح التفويض delegate المركب من تفويضين اثنيين .فقط يتم جمع التفويضات من نفس النوع. وكذلك المشغل - يمكن فك التفويض delegate المركب.
والفائدة منها ان يمكن استدعاء قائمة من الدول عند استدعاء التفويض delegate المركب وهذا ما يسمي التفويض delegate البث او الارسال المتعدد
مثال على التفويض delegate البث المتعدد
using System; delegate int NumberChanger(int n); namespace DelegateAppl { class TestDelegate { static int num = 10; public static int AddNum(int p) { num += p; return num; } public static int MultNum(int q) { num *= q; return num; } public static int getNum() { return num; } static void Main(string[] args) { //انشاء مثيلات التفويض NumberChanger nc; NumberChanger nc1 = new NumberChanger(AddNum); NumberChanger nc2 = new NumberChanger(MultNum); nc = nc1; nc += nc2; //استدعاء التفويض البث المتعدد nc(5); Console.WriteLine("Value of Num: {0}", getNum()); Console.ReadKey(); } } }
ناتج التفويض delegate البث المتعدد
Value of Num: 75
مثال على استخدام التفويض delegate
using System; using System.IO; namespace DelegateAppl { class PrintString { static FileStream fs; static StreamWriter sw; // الاعلان او التصريح عن التفويض public delegate void printString(string s); //دالة للطباعة عة شاشة الكونسل public static void WriteToScreen(string str) { Console.WriteLine("The String is: {0}", str); } //دالة لكتابة على الملفل public static void WriteToFile(string s) { fs = new FileStream("c:\\message.txt", FileMode.Append, FileAccess.Write); sw = new StreamWriter(fs); sw.WriteLine(s); sw.Flush(); sw.Close(); fs.Close(); } // هذه الالة تستخد الباراميتر للتوفيض //استدعاء الدالة عند الحاجة public static void sendString(printString ps) { ps("Hello World"); } static void Main(string[] args) { printString ps1 = new printString(WriteToScreen); printString ps2 = new printString(WriteToFile); sendString(ps1); sendString(ps2); Console.ReadKey(); } } }
ناتج مثال التفويض delegate
The String is: Hello World
Ahmed Ata Almahallawi
Freelancer
IT Help Desk,
SEO experience,PHP,C#,ASPX,SQL
SEO experience,PHP,C#,ASPX,SQL
Al alami st
gaza -jabalia, Gaza Strip
Palestine
DOB: 05/10/1984
by +Ahmed Almahallawi
by +Ahmed Almahallawi
6/1/2014
التسميات: advance-csharp
<< الصفحة الرئيسية