فصل 28 از 40 درس 1 از 1

Delegate

Delegate

بخشی از آموزش جامع C# و .NET 10

محتوای درس Delegate

Delegate یک Reference نوع‌امن به Method است و امکان پاس‌دادن رفتار به‌عنوان داده را فراهم می‌کند. Action، Func و Predicate شکل‌های Generic و رایج Delegateها هستند.

۱. تعریف Delegate

Delegate Signature متدهای سازگار را مشخص می‌کند و می‌تواند به یک یا چند Method اشاره کند.

مثال

delegate int Op(int a,int b);
         static int Add(int a,int b)=>a+b;
         Op op=Add;

در این مثال، مفهوم «تعریف Delegate» در یک قطعه کد مستقل نمایش داده شده است. مقدارها و نام‌ها عمداً ساده انتخاب شده‌اند تا رفتار اصلی قابل مشاهده باشد؛ در پروژه واقعی همین الگو با مدل دامنه، اعتبارسنجی و مدیریت خطای متناسب ترکیب می‌شود.

۲. Action

Action برای Methodهای بدون مقدار بازگشتی استفاده می‌شود.

مثال

Action<string> print=x=>Console.WriteLine(x); print("Hi");

در این مثال، مفهوم «Action» در یک قطعه کد مستقل نمایش داده شده است. مقدارها و نام‌ها عمداً ساده انتخاب شده‌اند تا رفتار اصلی قابل مشاهده باشد؛ در پروژه واقعی همین الگو با مدل دامنه، اعتبارسنجی و مدیریت خطای متناسب ترکیب می‌شود.

۳. Func

Func می‌تواند ورودی‌های متعدد و یک خروجی مشخص داشته باشد؛ آخرین Type Parameter نوع خروجی است.

مثال

Func<int,int> square=x=>x*x; Console.WriteLine(square(4));

در این مثال، مفهوم «Func» در یک قطعه کد مستقل نمایش داده شده است. مقدارها و نام‌ها عمداً ساده انتخاب شده‌اند تا رفتار اصلی قابل مشاهده باشد؛ در پروژه واقعی همین الگو با مدل دامنه، اعتبارسنجی و مدیریت خطای متناسب ترکیب می‌شود.

۴. Predicate

Predicate<T> قراردادی برای شرط bool روی T است.

مثال

Predicate<int> even=x=>x%2==0; Console.WriteLine(even(4));

در این مثال، مفهوم «Predicate» در یک قطعه کد مستقل نمایش داده شده است. مقدارها و نام‌ها عمداً ساده انتخاب شده‌اند تا رفتار اصلی قابل مشاهده باشد؛ در پروژه واقعی همین الگو با مدل دامنه، اعتبارسنجی و مدیریت خطای متناسب ترکیب می‌شود.

۵. Multicast Delegate

Delegate می‌تواند Invocation List داشته باشد، اما مدیریت خروجی و Exception در این حالت باید آگاهانه باشد.

مثال

Action a=()=>Console.WriteLine("A"); a+=()=>Console.WriteLine("B"); a();

در این مثال، مفهوم «Multicast Delegate» در یک قطعه کد مستقل نمایش داده شده است. مقدارها و نام‌ها عمداً ساده انتخاب شده‌اند تا رفتار اصلی قابل مشاهده باشد؛ در پروژه واقعی همین الگو با مدل دامنه، اعتبارسنجی و مدیریت خطای متناسب ترکیب می‌شود.

۶. مثال‌های عملی

Func<decimal, decimal, decimal> add = (a, b) => a + b;
         Action<string> print = Console.WriteLine;
         
         print(add(10m, 20m).ToString());

این نمونه عملی چند مفهوم فصل را در کنار هم قرار می‌دهد و برای مشاهده رفتار واقعی کد قابل اجرا و تغییر است.

public delegate decimal DiscountStrategy(decimal price);
         
         static decimal ApplyDiscount(decimal price, DiscountStrategy strategy)
             => strategy(price);

این نمونه عملی چند مفهوم فصل را در کنار هم قرار می‌دهد و برای مشاهده رفتار واقعی کد قابل اجرا و تغییر است.

۷. خطاهای رایج

• تعریف Delegate اختصاصی زمانی که Func یا Action کافی است

• نادیده گرفتن null برای Delegate اختیاری

• استفاده پیچیده از Multicast Delegate برای جریان‌های دامنه‌ای

۸. نکات اجرایی

• نام‌ها، Typeها و Methodها را متناسب با مفهوم دامنه و بدون ابهام انتخاب کنید.

• هشدارهای کامپایلر و Nullable را بدون بررسی خاموش نکنید.

• منطق هر بخش را تا حد امکان کوچک، قابل تست و مستقل از I/O غیرضروری نگه دارید.

۹. تمرین عملی

یک متد Calculate بسازید که دو عدد و یک Func برای عملیات را دریافت کند و جمع، تفریق و ضرب را با Lambda اجرا کند.

۱۰. جمع‌بندی

در این فصل، مبانی «Delegate» با تمرکز بر ساختارهای اصلی زبان، الگوهای صحیح استفاده و خطاهای رایج بررسی شد. تسلط بر این مفاهیم زمینه لازم برای اتصال موضوع به فصل‌های بعدی و طراحی کدهای خواناتر، قابل نگهداری و قابل تست را فراهم می‌کند.