آموزش و معرفی Delegate ها - دلیگیت چیست؟

آموزش و معرفی Delegate ها - دلیگیت چیست؟

دلیگیت ها در C# در واقع اشاره گری به متدها هستند. کاربرد اصلی آن جایی است که میخواهیم قطعه کدی را اجرا کنیم اما تا زمان اجرای برنامه آن قطعه کد مشخص نیست کدام قسمت از برنامه است.

Delegate ها در C# شبیه به اشاره گرها در C یا C++ هستند. یک delegate متغیر نوع مرجع است که ارجاعی به یک متد نگه می دارد. ارجاع می تواند در زمان اجرا تغییر کند.

Delegate ها به خصوص برای پیاده سازی event ها و متدهای call-back استفاده می شوند. همه delegate ها به طور صریح از کلاس System.Delegate مشتق می شوند.

اعلان Delegate ها

اعلان Delegate متدهایی را که می توانند توسط delegate مورد رجوع قرار بگیرند را تعیین می کند. یک delegate می تواند به یک متد رجوع کند که دارای امضای یکسانی از آن delegate باشد.

برای مثال delegate زیر را در نظر بگیرید:

public delegate int MyDelegate(string s);

Delegate تعریف شده می تواند برای ارجاع به هر متدی که دارای یک پارامتر string بوده و یک خروجی int دارد استفاده شود.

Syntax برای اعلان delegate به صورت زیر است:

delegate <return type> <delegate-name> <parameter list>

ایجاد نمونه (instance) از Delegate

یکبار که delegate type اعلان شد، یک شی delegate باید با کلمه کلیدی new ایجاد شود و به یک متد خاص مرتبط شود. زمان ایجاد یک delegate آرگومان پاس شده به new expression مشابه با فراخوانی متد نوشته می شود اما بدون آرگومان. برای مثال:

public delegate void printString(string s);

...

printString ps1 = new printString(WriteToScreen);

printString ps2 = new printString(WriteToFile);

مثال زیر اعلان، نمونه سازی و استفاده از delegate را نشان می دهد که می تواند برای متدهای مرجع که یک پارامتر صحیح می گیرند و یک مقدار صحیح بر میگردانند استفاده شود. متدهایی که delegate به آنها رجوع می کند باید از نوع static باشند.

using System;
delegate int NumberChanger(int n);

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());
    }
}

بعد از compile و اجرای کد فوق خروجی زیر ظاهر می شود:

Value of Num: 35

Value of Num: 175

MultiCast Delegate (ترکیب دلیگیت)

اشیا delegate می توانند با استفاده از عملگر + ترکیب شوند.  یک delegate ترکیب شده دو delegate را که از آنها ترکیب شده فراخوانی می کند. فقط delegate های هم نوع می توانند ترکیب شوند. عملگر می تواند برای حذف یک delegate مولفه از یک delegate ترکیب شده استفلاده شود.

با استفاده از این ویژگی Delegate ها شما می توانید یک لیست فراخوانی از متدهایی که در زمانی که delegate فراخوانی می شوند را ایجاد کنید. به این multicasting یک delegate گفته می شود. برنامه زیر multicasting یک delegate را نشان می دهد.

delegate int NumberChanger(int n);
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());
    }
}

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

Value of Num: 75

کاربرد Delegate

مثال زیر استفاده delegate را نشان می دهد. Delegate printString می تواند برای ارجاع متدی که یک رشته ورودی می گیرد و چیزی بر نمی گرداند استفاده شود.

ما از این delegate برای فراخوانی دو متد استفاده می کنیم، اولی رشته را در console چاپ می کند و دومی آن را در یک فایل چاپ می کند:

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);
    }
}

خروجی کد فوق:

The String is: Hello World

فایل مثال

اشتراک گذاری