یادگیری سی شارپ از مفاهیم پایه تا پروژه محور: شیگرایی، کار با SQL و LINQ، ORMها (Entity Framework)، ساخت پروژه مدیریت رستوران با گزارشات حرفهای و امکانات کامل!
مشاهده بیشتریادگیری MVC Core از مبانی تا پیشرفته: شیگرایی، Routing، Entity Framework، امنیت، تست یونیت، Razor، Ajax، و پروژههای کاربردی! یک دوره کامل برای تسلط بر توسعه وب با ASP.NET Core. به صورت حضوری و آنلاین!
مشاهده بیشترمشخصات مقاله
مبحث Delegate در C#
Delegateها
Delegateها در C# مشابه با اشارهگرهای توابع در C و C++ هستند. یک Delegate متغیر نوع مرجعی است که این ارجاع به متد را در خود نگهداری میکند. این مرجع را میتوان در زمان اجرا تغییر داد.
Delegateها به ویژه در اجرای رویدادها و متدهای کال بک کاربرد دارند. تمامی Delegate ها به صورت ضمنی از کلاس System.Delegate مشتق میشوند.
اعلان Delegateها
اعلان Delegateها میتوان باعث میشود متدهایی تعیین شوند که بتوان با استفاده از این Delegateها به آنها اشاره کرد. Delegate ها میتوانند به یک متد که امضای آن مانند امضای این Delegate است اشاره کنند.
برای مثال Delegateی زیر را در نظر بگیرید:
public delegate int MyDelegate (string s);
با استفاده از این Delegate میتوان به هر متدی که دارای تنها یک پارامتر رشتهای است و یک متغیر از نوع عدد صحیح را برگشت میدهد اشاره کرد.
سینتکس اعلان Delegate را میتوانید در زیر مشاهده کنید:
delegate < return type > < delegate-name > < parameter list >
نمونهسازی 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) { //create delegate instances NumberChanger nc1 = new NumberChanger(AddNum); NumberChanger nc2 = new NumberChanger(MultNum); //calling the methods using the delegate objects 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
قالببندی متعدد یک Delegate
اشیاء Delegateها را میتوان با استفاده از عملگر «+» ترکیب کرد. 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) { //create delegate instances NumberChanger nc; NumberChanger nc1 = new NumberChanger(AddNum); NumberChanger nc2 = new NumberChanger(MultNum); nc = nc1; nc += nc2; //calling multicast nc(5); Console.WriteLine("Value of Num: {0}", getNum()); Console.ReadKey(); } } }
زمانی که کد بالا کامپایل و اجرا شود، نتیجه به صورت زیر نمایش داده میشود:
Value of Num: 75
استفاده از Delegateها
در مثال زیر استفاده از Delegateها را مشاهده میکنید. از Delegateی printString میتوان جهت اشاره به متد مرجعی که رشتهای را به عنوان ورودی دریافت میکند و چیزی را برگشت نمیدهد، استفاده کرد.
جهت فراخوانی دو متد که یکی رشته را در کنسول و دیگری رشته را در یک فایل چاپ میکند، از این Delegate استفاده میکنیم:
=using System; using System.IO; namespace DelegateAppl { class PrintString { static FileStream fs; static StreamWriter sw; // delegate declaration public delegate void printString(string s); // this method prints to the console public static void WriteToScreen(string str) { Console.WriteLine("The String is: {0}", str); } //this method prints to a file 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(); } // this method takes the delegate as parameter and uses it to // call the methods as required 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(); } } }
زمانی که کد بالا کامپایل و اجرا میشود، نتیجه به صورت زیر نمایش داده میشود:
The String is: Hello World