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» با تمرکز بر ساختارهای اصلی زبان، الگوهای صحیح استفاده و خطاهای رایج بررسی شد. تسلط بر این مفاهیم زمینه لازم برای اتصال موضوع به فصلهای بعدی و طراحی کدهای خواناتر، قابل نگهداری و قابل تست را فراهم میکند.