آموزشگاه برنامه نویسی تحلیل داده
آموزشگاه برنامه نویسی تحلیل داده

مبحث 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

  • 260
  •    252
  • تاریخ ارسال :   1397/08/22

دانلود PDF دانشجویان گرامی اگر این مطلب برای شما مفید بود لطفا ما را در GooglePlus محبوب کنید
رمز عبور: tahlildadeh.com یا www.tahlildadeh.com
ارسال دیدگاه نظرات کاربران
شماره موبایل دیدگاه
عنوان پست الکترونیک

ارسال

آموزشگاه برنامه نویسی تحلیل داده
آموزشگاه برنامه نویسی تحلیل داده

تمامی حقوق این سایت متعلق به آموزشگاه تحلیل داده می باشد .