دلیگیت‌ها (Delegates) در C#

Delegate یک نوع داده در C# است که به ما اجازه می‌دهد متدها را به عنوان پارامتر ارسال کنیم و رفتارهای پویا در برنامه ایجاد کنیم.

Delegate چیست؟

Delegate یک reference به متدها است. یعنی می‌توانیم یک متد را داخل یک متغیر ذخیره کنیم و آن را اجرا کنیم.

تعریف Delegate


public delegate void Notify(string message);

استفاده از Delegate


public class Messenger
{
    public void SendMessage(string message)
    {
        Console.WriteLine(message);
    }
}

Messenger messenger = new Messenger();

Notify notify = messenger.SendMessage;

notify("Hello from Delegate");

Delegate با متد استاتیک


public class Logger
{
    public static void Log(string message)
    {
        Console.WriteLine("Log: " + message);
    }
}

Notify notify = Logger.Log;

notify("System started");

MultiCast Delegate

یک delegate می‌تواند به چند متد اشاره کند.


public class Messenger
{
    public void Method1(string msg)
    {
        Console.WriteLine("Method1: " + msg);
    }

    public void Method2(string msg)
    {
        Console.WriteLine("Method2: " + msg);
    }
}

Messenger m = new Messenger();

Notify notify = m.Method1;
notify += m.Method2;

notify("Hello");

Action و Func

در C# مدرن معمولاً به جای delegate سفارشی از Action و Func استفاده می‌شود.

Action (بدون خروجی)


Action print = message =>
{
    Console.WriteLine(message);
};

print("Hello Action");

Func (با خروجی)


Func add = (a, b) => a + b;

Console.WriteLine(add(3, 5));

کاربرد واقعی Delegate


public class Processor
{
    public void Execute(Action callback)
    {
        Console.WriteLine("Processing...");
        callback();
    }
}

Processor p = new Processor();

p.Execute(() =>
{
    Console.WriteLine("Done!");
});

جمع‌بندی

Delegateها ابزار قدرتمندی در C# هستند که امکان پاس دادن رفتار (behavior) به متدها و ایجاد طراحی‌های انعطاف‌پذیر را فراهم می‌کنند.