سلام دوستان
این پست در مورد delegate اموزش خواهم داد
دلیگیت نماینده یک نوع است که نشان دهنده ارجاع یا نشانگر به روش هایی با یک لیست و یا پارامتر خاص و نوع بازگشت است. هنگامی که یک نماینده را انتخاب می کنید، می توانید نمونه آن را با هر روش و با یک امضای سازگار و نوع بازگشتی مرتبط کنید.
به تعریف ساده تر: یک Delegate نوعی اشارهگر است به توابع در سی شارپ که میتواند ارجاعی را به یک یا چند تابع بخصوص داشته باشد. منظور از توابع در سی شارپ، متدها هستند. امضای یک Delegate باید با متدی که به آن اشاره میکنید یکی باشد.
نمایندگان برای انتقال روش ها به عنوان استدلال از روش های دیگر استفاده می کنن . درخاست رویداد چیزی بیش از روش هایی هست که از طریق نماینده مورد استفاده قرار می گیرن. شما یک روش سفارشی ایجاد می کنید و یک کلاس مانند یک کنترل ویندوز می تواند وقتی یک رخداد خاص رخ می دهد، روش خود را فراخوانی کند.
مزایای دلیگیت
روش خوبی برای کپسول کردن روش ها است.
نمایندگان کلاس کتابخانه در فضای نام سیستم هستند.
این نشانگر ایمنی نوع هر روش است.
نمایندگان عمدتا در اجرای روش های فراخوانی و رویدادها استفاده می شوند.
نمایندگان می توانند با هم زنجیر شوند زیرا دو یا چند روش می توانند در یک رویداد واحد نامگذاری شوند.
در مورد کلاس شی که آن را ارجاع می دهد، اهمیتی نمی دهد.
نمایندگان همچنین می توانند در "روش های ناشناس" استفاده شوند.
روشهای ناشناس (C # 2.0) و عبارات لامبدا (C # 3.0) برای deleting انواع در حوزه های خاص کامپایل می شوند. گاهی اوقات این ویژگیها با هم به عنوان توابع ناشناس شناخته می شوند.
دلیگیت را می توان با استفاده از کلمه کلیدی نماینده اعلام کرد. هنگامی که یک نماینده اعلام می شود، نماینده مثال را ارزیابی و با آن روش هایی که نوع بازگشت و لیست پارامتر آنها با اعلام نماینده مطابقت دارد، تماس می گیرند.
سینتکس کلی به این شکله
[modifier] delegate [return_type] [delegate_name] ([parameter_list]);
توضیحات:
نماینده: این کلمه کلیدی است که برای تعیین نماینده مورد استفاده قرار می گیرد.
return_type: نوع ارزش بازگشتی توسط روش هایی است که نماینده می خواهد تماس بگیرد. این می تواند خالی باشد روش باید یک نوع بازگشت به عنوان نماینده داشته باشد.
delegate_name: این نام یا شناسه کاربری برای نماینده است.
parameter_list: این شامل پارامترهایی است که از طریق روش انجام می شود از طریق نماینده نامیده می شود.
توجه: نماینده تنها یک روش را می پذیرد که با امضاو نوع بازگشت آن موافق است. یک روش می تواند یک روش استاتیکی مرتبط با یک کلاس باشد یا می تواند روش نمونه ای است که با یک شیء مرتبط است، مهم نیست.
نمایندگان مجاز
هنگامی که یک نوع نماینده اعلام می شود، یک شیء نماینده با کلید واژه جدید ایجاد می شود و با یک روش خاص مرتبط می شود. هنگام ایجاد یک نماینده، استدلال ارسال شده به عبارت جدید، مشابه روش تماس است، اما بدون استدلال به روش. مثلا
public delegate void printString(string s); ... printString ps1 = new printString(WriteToScreen); printString ps2 = new printString(WriteToFile);
مثال زیر نشان می دهد اعلام، اکتساب کردن و استفاده از نماینده است که می تواند برای ارجاع به روش هایی که یک پارامتر عدد صحیح را می گیرند و مقدار عدد صحیح را نشون میده
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(); } } }
نتیجه اجرا
Value of Num: 35 Value of Num: 175
اشیاء نماینده را می توان با استفاده از عملگر "+" ترکیب کرد. نماینده متشکل از دو نماینده تشکیل میشه --خب . فقط نمایندگان همان نوع می توانند با هم ترکیب بشن . اپراتور "-" می تواند برای حذف یک نماینده جزء از نماینده متشکل از آن استفاده شود.یعنی اونو کسر کنه
با استفاده از این ویژگی نمایندگان می توانید فهرست فراخوانی روش هایی ایجاد کنید که هنگام فراخوانی یک نماینده فراخوانی می شود. این با عنوان " چندرسانه ای" از نماینده نامگذاری شده ؛
اینم یه مثال در این باره
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(); } } }-
و خروجی این کد میشه =====> Value Of Num=75
یه مثال دیگه
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(); } } }
خروجی میشه Hello World
اینم یه مثال از خود ماکروسافت
using System; delegate void D(int x); class C { public static void M1(int i) { Console.WriteLine("C.M1: " + i); } public static void M2(int i) { Console.WriteLine("C.M2: " + i); } public void M3(int i) { Console.WriteLine("C.M3: " + i); } } class Test { static void Main() { D cd1 = new D(C.M1); cd1(-1); // call M1 D cd2 = new D(C.M2); cd2(-2); // call M2 D cd3 = cd1 + cd2; cd3(10); // call M1 then M2 cd3 += cd1; cd3(20); // call M1, M2, then M1 C c = new C(); D cd4 = new D(c.M3); cd3 += cd4; cd3(30); // call M1, M2, M1, then M3 cd3 -= cd1; // remove last M1 cd3(40); // call M1, M2, then M3 cd3 -= cd4; cd3(50); // call M1 then M2 cd3 -= cd2; cd3(60); // call M1 cd3 -= cd2; // impossible removal is benign cd3(60); // call M1 cd3 -= cd1; // invocation list is empty so cd3 is null cd3(70); // System.NullReferenceException thrown cd3 -= cd1; // impossible removal is benign } }
و خروجی
C.M1: -1 C.M2: -2 C.M1: 10 C.M2: 10 C.M1: 20 C.M2: 20 C.M1: 20 C.M1: 30 C.M2: 30 C.M1: 30 C.M3: 30 C.M1: 40 C.M2: 40 C.M3: 40 C.M1: 50 C.M2: 50 C.M1: 60 C.M1: 60
و اخرین مثال
using System; namespace GeeksForGeeks { class Geeks { //"addnum" --"subnum" - ساخت 2 دلیگیت با این نامها public delegate void addnum(int a, int b); public delegate void subnum(int a, int b); //"sum" متد public void sum(int a, int b) { Console.WriteLine("(100 + 40) = {0}", a + b); } // method "subtract" public void subtract(int a, int b) { Console.WriteLine("(100 - 60) = {0}", a - b); } public static void Main(String []args) { Geeks obj = new Geeks(); addnum del_obj1 = new addnum(obj.sum); subnum del_obj2 = new subnum(obj.subtract); del_obj1(100, 40); del_obj2(100, 60); } } }
خروجی کد آخر
(100 + 40) = 140 (100 - 60) = 40
و جهت درک بهتر 2 تا مثال برا دانلود میزارم که یکیش تقریبا همه متدهای دلیگیت رو مثال زده
پروژه اول
پروژه دومی
امیدورم استفاده کنید