مفهوم Delegateها در #C

Delegate یک نوع ارجاعی است که reference از یک متد را نگهداری می‌کند. هر متدی که دارای امضای مشابه با امضای Delegateها داشته باشد می‌تواند به یک Delegate منتسب شود.

Delegate ها بسیار مشابه به اشاره‌گر به توابع در زبان‌هایی مانند ++C هستند، با این تفاوت که Delegateها نوع-امن هستند و تحت نظارت مستقیم کامپایلر در دات نت تعریف و اجرا می‌شوند.

می‌توان گفت Delegateها پیاده‌سازی شی‌گرایی از اشاره‌گر به توابع هستند.

سه مرحله اصلی برای تعریف و استفاده از Delegateها وجود دارد:

۱. تعریف Delegate

برای تعریف Delegate از واژه کلیدی delegate استفاده می‌شود:

public delegate void MyDelagate(int a, int b);

۲. نمونه سازی از Delegate

برای ایجاد یک نمونه از Delegateها باید یک متد با امضای یکسان با Delegate معرفی شده را به آن انتساب داد:

MyDelagate sum = new MyDelagate(یک نمونه متد با امضای معتبر);

۳. فراخوانی Delegate

فراخوانی یک Delegate مشابه فراخوانی ساده‌ی یک متد است:

 

Console.WriteLine("Sum of two integer is = " + sum(2, 20));

 

به کدهای ذیل توجه کنید:

public delegate void MyDelagate(int a, int b);
public class Example
    {
        //  انتساب داده شود delegate متدی که قرار است به
        public void Sum(int a, int b)
        {
            Console.WriteLine("Sum of integers is = " + (a + b));
        }
        // انتساب داده شود delegate متدی که قرار است به
        public void Difference(int a, int b)
        {
            Console.WriteLine("Difference of integer is = " + (a - b));
        }
    }

 class Program
    {
        static void Main(string[] args)
        {
            var example = new Example();
            var sum = new MyDelagate(example.Sum);
            var dif = new MyDelagate(example.Difference);

            sum(20, 12);
            dif(20, 12);

            Console.ReadKey();
        }
    }

و در خروجی داریم:

/*

Sum of two integer is = 32
Difference of two integer is = 8

*/

ماهیت وجودی Delegateها:

- Delegateها باعث می‌شوند تا بتوانیم متدها را به صورت پارامتر ارسال کنیم (یکی از وظایف مهم آن‌ها این است که ‌می‌توان توسط آنها پیاده ‌سازی یک متد را، به‌عهده‌ی توسعه‌دهنده‌ی نهایی مصرف‌‌کننده از کد یا اسمبلی ما گذاشت).

- Delegateها در هنگام استفاده از روال‌های انجام رخدادها (Event handling) مورد استفاده قرار می‌گیرند.

- Delegateها می‌توانند به‌یکدیگر متصل شوند، این قابلیت اجازه می‌دهد تا یک مجموعه متد به عنوان یک واحد مجزا اجرا شود.

- زمانی که یک Delegate ایجاد می‌شود، متد انتساب داده شده به آن هرگز تغییری نخواهد کرد، این به‌دلیل ماهیت تغییرناپذیر Delegateها است.

- Delegateها روشی را برای اجرای متدها در زمان اجرا فراهم می‌کنند.

- همه‌ی Delegateها از کلاس System.MulticastDelegate مشتق می‌شوند که خود آن از کلاس System.Delegate مشتق می‌شود.

- نوع‌های Delegateهای ایجاد شده با یکدیگر یکسان نیستند، حتی اگر دارای امضای یکسانی باشند. تنها زمانی دارای نوع یکسانی هستند که به یک متد تعریفی یکسان reference داده شده باشند. (هر دو از یک تعریف Delegate منشعب شده باشند!)

اگر تعریف Delegateی به شکل زیر داشته باشیم:

 public delegate void MyDelagate(int a, int b);
 public delegate void MyDelagate2(int a, int b);

قطعه کد زیر با اینکه در آن Delegateها دارای امضای یکسانی هستند باعث ایجاد خطای

'Cannot implicitly convert type 'ConsoleApplication.MyDelagate2' to 'ConsoleApplication.MyDelagate خواهد شد:

 var example = new Example();
 var sum = new MyDelagate(example.Sum);
 sum = new MyDelagate2(example.Difference); //خطای کامپایلر

 

انواع Delegateها:

۱. Delegateهای Single cast

این نوع Delegateها فقط reference یک متد تکی را نگه می‌دارند. مثال‌های بالا همگی چگونگی تعریف این نوع Delegate را نشان می‌دهند.

۲.Delegateهای Multi cast

Delegateی که reference مربوط به بیشتر از یک متد را نگه‌داری می‌کند، Multi cast نامیده می‌شود. یک Delegate از این نوع تنها شامل reference متدهایی است که نوع خروجی آنها void باشد.

در اینجا از عملگرهای + و += برای ترکیب نمونه‌های ایجاد شده از Delegateها استفاده می‌کنیم. Delegateهای Multi cast تنها زمانی باهم برابرند که با ترتیب یکسانی به متدهای تعریفی یکسانی reference شده باشند:

 public delegate void MyDelagate(int a, int b);
    
    public class Example
    {
        //  انتساب داده شود delegate متدی که قرار است به
        public void Sum(int a, int b)
        {
            Console.WriteLine("Sum of integers is = " + (a + b));
        }
        // انتساب داده شود delegate متدی که قرار است به
        public void Difference(int a, int b)
        {
            Console.WriteLine("Difference of integer is = " + (a - b));
        }
    }

 class Program
    {
        static void Main(string[] args)
        {
            var example = new Example();
            var dgt = new MyDelagate(example.Sum);

            //Delegate انتساب یک متد دیگر به 
            dgt += new MyDelagate(example.Difference);
            dgt(20, 19);

            Console.ReadKey();
        }
    }

و خروجی در نهایت به شکل زیر خواهد بود:

/*

 Sum of integers is = 39 
 Difference of integer is = 1

*/
  • Book.mark.hu
  • co.mments
  • De.lirio.us
  • del.icio.us
  • Digg
  • DotNetKicks
  • E-Mail
  • Facebook
  • feedmelinks
  • Google
  • LinkedIn
  • msdn Social
  • MyShare
  • Slashdot
  • StumbleUpon
  • TwitThis
  • Tumblr
  • Yahoo! Buzz
  • Yahoo! MyWeb
  • Print
امکان ارسال نظر برای این موضوع وجود ندارد