۱۴۰۴/۰۷/۰۹ Nebular

Delegates, Event و Lambda

۱. Delegates

تعریف:

  • Delegate نوع داده‌ای است که می‌تواند مرجع یک متد را نگه دارد و بعداً آن را فراخوانی کند.
  • مشابه function pointer در C/C++ است ولی type-safe است.

مثال ساده:

// تعریف delegate
delegate void MyDelegate(string message);

class Program
{
    static void ShowMessage(string msg)
    {
        Console.WriteLine(msg);
    }

    static void Main()
    {
        // انتساب متد به delegate
        MyDelegate d = ShowMessage;
        d("Hello Delegate"); // فراخوانی متد از طریق delegate
    }
}

نکته: Delegate می‌تواند چند متد را همزمان نگه دارد (Multicast Delegate).


۲. Events

تعریف:

  • Event نوع خاصی از delegate است که فقط می‌توان subscribe (+=) یا unsubscribe (-=) کرد.
  • کد خارج از کلاس نمی‌تواند event را invoke کند، فقط کلاس مالک می‌تواند.

مثال:

class Publisher
{
    public event Action OnChange; // event تعریف شد

    public void RaiseEvent()
    {
        OnChange?.Invoke(); // فقط کلاس خودش می‌تواند فراخوانی کند
    }
}

class Program
{
    static void Main()
    {
        Publisher p = new Publisher();
        p.OnChange += () => Console.WriteLine("Event triggered!"); // Subscribe
        p.RaiseEvent();
    }
}

نکته: Event بیشتر برای پیام‌رسانی بین کلاس‌ها و تغییر وضعیت استفاده می‌شود.


۳. Lambda و Action/Func

۳.۱ Lambda Expressions

  • Lambda یک روش کوتاه برای تعریف متدهای ناشناس (Anonymous Method) است.
  • شکل کلی: (parameters) => expression

مثال:

Func<int, int, int> add = (a, b) => a + b;
Console.WriteLine(add(3, 5)); // خروجی: 8

۳.۲ Action و Func

  • Action → delegate بدون مقدار بازگشتی
  • Func<T> → delegate با مقدار بازگشتی

مثال Action:

Action<string> print = msg => Console.WriteLine(msg);
print("Hello Action"); // خروجی: Hello Action

مثال Func:

Func<int, int, int> multiply = (x, y) => x * y;
Console.WriteLine(multiply(4, 5)); // خروجی: 20

نکته: Lambda‌ها معمولاً برای LINQ, Event handlers و کوتاه کردن delegate ها استفاده می‌شوند.


۴. جمع‌بندی نکات مهم آزمونی

نکتهتوضیح
Delegateنوع داده‌ای برای نگه داشتن مرجع متد، type-safe
Multicast Delegateمی‌تواند چند متد را نگه دارد و همزمان فراخوانی کند
Eventdelegate با محدودیت، فقط subscribe/unsubscribe بیرون کلاس
Lambdaمتد ناشناس کوتاه، (params) => expression
Actiondelegate بدون بازگشت مقدار
Funcdelegate با بازگشت مقدار
Accept Cookies
Accept Cookies
[your-shortcode]