سیشارپ یکی از زبانهای برنامهنویسی شیءگرا و مدرن است که به دلیل انعطافپذیری و قدرت آن، برای توسعه نرمافزارهای پیچیده و متنوع بهکار میرود. یکی از مفاهیم پیشرفته در سیشارپ که به توسعهدهندگان اجازه میدهد تا کنترل بیشتری بر اجرای متدها داشته باشند، Delegate است. در این مقاله، به زبان ساده و روان به بررسی Delegate، کاربردهای آن و مفاهیم مرتبط با آن در سیشارپ میپردازیم.
Delegate در سیشارپ چیست؟
Delegate نوعی مرجع به یک متد است. به عبارت سادهتر، Delegate به شما اجازه میدهد که آدرس یک متد را ذخیره کرده و آن را بهصورت غیرمستقیم فراخوانی کنید. اگر قبلاً با زبان برنامهنویسی C کار کرده باشید، احتمالاً با مفهوم اشارهگر به تابع آشنا هستید. Delegate در سیشارپ عملکرد مشابهی دارد؛ یعنی شما میتوانید یک متد را به یک Delegate مرتبط کنید و هر زمان که نیاز داشتید، آن متد را از طریق Delegate فراخوانی کنید.
Delegate در واقع انتزاعی از یک متد است، به این معنا که نوعی "قرارداد" است که مشخص میکند یک متد باید چه نوع ورودی و خروجی داشته باشد. این ویژگی به شما اجازه میدهد تا متدهایی که ورودی و خروجی مشابه دارند را به Delegate متصل کنید.
تعریف Delegate در سیشارپ
برای تعریف یک Delegate، از کلمه کلیدی delegate استفاده میشود. به عنوان مثال، یک Delegate که به متدهایی با دو ورودی عدد صحیح و یک خروجی عدد صحیح اشاره میکند، به شکل زیر تعریف میشود:
public delegate int MathOperation(int a, int b);
در اینجا، MathOperation یک Delegate است که میتواند به هر متدی که دو عدد صحیح را بهعنوان ورودی دریافت و یک عدد صحیح را برگرداند، اشاره کند.
استفاده از Delegate
فرض کنید چند متد مختلف دارید که ورودی و خروجی مشابه دارند و میخواهید بنا به شرایط مختلف یکی از آنها را فراخوانی کنید. برای این کار میتوانید از Delegate استفاده کنید:
public class Calculator
{
public int Add(int a, int b)
{
return a + b;
}
public int Subtract(int a, int b)
{
return a - b;
}
}
public class Program
{
public static void Main()
{
Calculator calculator = new Calculator();
MathOperation operation;
// انتخاب متد Add
operation = calculator.Add;
Console.WriteLine($"نتیجه جمع: {operation(5, 3)}");
// تغییر به متد Subtract
operation = calculator.Subtract;
Console.WriteLine($"نتیجه تفریق: {operation(5, 3)}");
}
}
در این مثال، Delegate MathOperation به دو متد Add و Subtract اشاره میکند و بسته به نیاز، هر یک از این متدها فراخوانی میشوند.
کاربرد Delegate در برنامههای واقعی
یکی از مهمترین کاربردهای Delegate در برنامههای کاربردی، امکان انجام عملیات غیرمستقیم است. فرض کنید در یک برنامه دکمهای دارید که پس از کلیک، باید یک متد خاص اجرا شود. اگر بخواهید این متد بهصورت پویا (بدون نوشتن مستقیم نام متد در کد) تعیین شود، میتوانید از Delegate استفاده کنید.
معرفی Func و Action
در سیشارپ، برای سهولت در کار با Delegateها، مایکروسافت دو Delegate عمومی به نامهای Func و Action ارائه داده است. این Delegateها به شما اجازه میدهند که بدون نیاز به تعریف Delegateهای سفارشی، متدهایی را به Delegateها متصل کنید.
1. Action
Action یک نوع Delegate است که میتواند تا 16 ورودی داشته باشد اما خروجی ندارد. در واقع، Action برای متدهایی استفاده میشود که فقط ورودی دارند و خروجی آنها void است.
Action<int, int> printSum = (a, b) => Console.WriteLine(a + b);
printSum(3, 4); // خروجی: 7
در این مثال، یک Action تعریف شده که دو ورودی از نوع int دارد و مجموع آنها را چاپ میکند. این Action هیچ خروجیای ندارد، زیرا نوع خروجی آن void است.
2. Func
Func مشابه Action است، با این تفاوت که خروجی دارد. آخرین پارامتر در Func همیشه نوع خروجی است و میتواند تا 16 ورودی داشته باشد.
Func<int, int, int> sum = (a, b) => a + b;
Console.WriteLine(sum(3, 4)); // خروجی: 7
در اینجا، یک Func تعریف شده که دو ورودی عدد صحیح دریافت میکند و خروجی آن نیز عدد صحیح است.
تفاوت Func و Action
Action: میتواند حداکثر 16 ورودی داشته باشد و هیچ خروجی ندارد (یعنی خروجی آن void است).
Func: میتواند حداکثر 16 ورودی داشته باشد و یک خروجی دارد که نوع آن با آخرین پارامتر تعیین میشود.
مزایای استفاده از Func و Action
استفاده از Func و Action مزایای متعددی دارد:
- کاهش کدنویسی: دیگر نیازی به تعریف Delegateهای سفارشی ندارید و میتوانید از Delegateهای عمومی استفاده کنید.
- انعطافپذیری: این Delegateها برای متدهایی با ورودیها و خروجیهای مختلف قابل استفاده هستند.
- سادگی و خوانایی بیشتر: استفاده از Func و Action کد شما را سادهتر و خواناتر میکند، زیرا نیازی به تعریف Delegateهای خاص ندارید.
جمعبندی
Delegate یکی از مفاهیم قدرتمند در سیشارپ است که به شما اجازه میدهد تا به متدها اشاره کنید و آنها را بهصورت غیرمستقیم فراخوانی کنید. این ویژگی بهخصوص در مواقعی که نیاز به اجرای پویا و انعطافپذیر متدها دارید، بسیار کاربردی است. همچنین با استفاده از Delegateهای عمومی مانند Func و Action، میتوانید از قدرت Delegateها با سادگی و کارایی بیشتری بهرهمند شوید.
برای افزودن دیدگاه خود، نیاز است ابتدا وارد حساب کاربریتان شوید