Delegates در سی شارپ
Delegates در سیشارپ ، مرجع به متدها هستند که امکان ارسال متد بهعنوان پارامتر و مدیریت رویدادها را فراهم میکنند..
Delegates در سی شارپ
در زبان برنامهنویسی سیشارپ، نمایندهها (Delegates) نوعی مرجع به متدها هستند که اجازه میدهند متدها را بهعنوان پارامتر به دیگر متدها ارسال کرده و کدها را بهطور داینامیک (پویا) مدیریت کنید.
نمایندهها امکان پیادهسازی مفاهیم مهمی همچون پولیمورفیسم (Polymorphism) و مدیریت رویدادها (Event Handling) را فراهم میکنند و در عین حال کدهایی تمیز و انعطافپذیر ایجاد میکنند.
در این مقاله به آموزش Delegates، انواع نمایندهها از جمله Func و کاربرد آنها میپردازیم.
نمایندهها در سیشارپ مشابه اشارهگرهای تابعی در زبانهای C و C++ هستند، اما با امنیت بیشتری پیادهسازی شدهاند.
یک نماینده بهطور کلی یک نوع دادهای است که میتواند به هر متدی که امضای سازگار دارد اشاره کند.
وقتی یک متد به نمایندهای اختصاص داده شود، نماینده میتواند آن متد را در هر زمانی فراخوانی کند.
تعریف و ساختار نمایندهها
برای تعریف یک نماینده در سیشارپ، باید نوع بازگشتی و پارامترهای ورودی آن را مشخص کنید.
مثال: تعریف نمایندهای که دو عدد صحیح را جمع میکند:
// تعریف یک نماینده که به متدی اشاره میکند که دو عدد صحیح را دریافت کرده و یک عدد صحیح باز میگرداند
public delegate int Operation(int a, int b);
class Program
{
static void Main(string[] args)
{
// ایجاد یک نمونه از نماینده
Operation add = Sum;
// فراخوانی متد از طریق نماینده
Console.WriteLine("Sum: " + add(5, 3));
}
// متدی که با امضای نماینده Operation سازگار است
static int Sum(int x, int y)
{
return x + y;
}
}
در این مثال، نمایندهای به نام Operation تعریف شده است که دو عدد صحیح را بهعنوان پارامتر دریافت کرده و یک عدد صحیح بازمیگرداند.
سپس، نماینده Operation برای متدی به نام Sum تعریف شده و در نهایت از طریق نماینده، متد فراخوانی شده است.
کاربردهای Delegates در سی شارپ
نمایندهها کاربردهای گستردهای در سیشارپ دارند، از جمله:
-
پاس کردن متدها به عنوان پارامتر
نمایندهها امکان ارسال متدها به دیگر متدها را فراهم میکنند، که به شما اجازه میدهد تا کدهایی انعطافپذیرتر و قابل استفاده مجدد بنویسید. -
مدیریت رویدادها
در سیشارپ، رویدادها براساس نمایندهها پیادهسازی میشوند و به شما امکان میدهند که رفتارهای مختلف را هنگام وقوع یک رویداد اعمال کنید. -
پیادهسازی مفاهیم چندریختی (Polymorphism)
نمایندهها به شما امکان میدهند تا چندین متد با امضای مشابه را به عنوان یک نوع واحد در کد مدیریت کنید.
// تعریف یک نماینده که به متدی اشاره میکند که دو عدد صحیح را دریافت کرده و یک عدد صحیح باز میگرداند
public delegate int Operation(int a, int b);
class Program
{
static void Main(string[] args)
{
// ایجاد یک نمونه از نماینده
Operation add = Sum;
// فراخوانی متد از طریق نماینده
Console.WriteLine("Sum: " + add(5, 3));
}
// متدی که با امضای نماینده Operation سازگار است
static int Sum(int x, int y)
{
return x + y;
}
}
انواع نمایندههای از پیش تعریف شده
سیشارپ چند نوع نماینده از پیش تعریف شده ارائه میدهد که از رایجترین انواع نمایندهها هستند.
این نمایندهها برای سادهسازی کد و اجتناب از تعریف نمایندههای سفارشی در هر بار استفاده میشوند.
-
Action
Action نمایندهای است که میتواند یک یا چند پارامتر ورودی دریافت کند اما هیچ مقداری بازنمیگرداند (void).
مثال:
Action<string> greet = name => Console.WriteLine("Hello, " + name);
greet("Ali"); // خروجی: Hello, Ali
-
Func
Func نوعی نماینده است که یک یا چند پارامتر ورودی دریافت کرده و مقداری را بازمیگرداند.
آخرین پارامتر در تعریف Func همیشه نوع داده بازگشتی است.
مثال:
Func<int, int, int> multiply = (a, b) => a * b;
Console.WriteLine(multiply(5, 3)); // خروجی: 15
-
Predicate
Predicate نمایندهای است که یک پارامتر دریافت کرده و یک مقدار bool بازمیگرداند.
این نوع نماینده برای شرایط و فیلترهای منطقی استفاده میشود.
مثال:
Predicate<int> isEven = x => x % 2 == 0;
Console.WriteLine(isEven(4)); // خروجی: True
آموزش Func Delegates
Func یکی از پراستفادهترین انواع نمایندهها در سیشارپ است.
این نماینده میتواند چندین پارامتر ورودی و یک مقدار بازگشتی داشته باشد، که نوع آخر در تعریف آن نمایانگر نوع دادهای است که بازمیگرداند.
تعریف و استفاده از Func در سی شارپ
فرض کنید میخواهیم تابعی داشته باشیم که سه عدد صحیح را به عنوان ورودی دریافت کند و حاصلجمع آنها را بازگرداند.
با استفاده از Func میتوانیم این کد را بدون نیاز به تعریف نماینده سفارشی پیادهسازی کنیم.
مثال:
Func<int, int, int, int> addThreeNumbers = (a, b, c) => a + b + c;
Console.WriteLine(addThreeNumbers(2, 3, 5)); // خروجی: 10
در این مثال، <Func<int, int, int, int یک نماینده از نوع Func است که سه عدد صحیح به عنوان ورودی دریافت کرده و یک عدد صحیح به عنوان خروجی بازمیگرداند.
کاربردهای Func در برنامهنویسی
-
کاهش کدهای اضافی
Func اجازه میدهد که کدهای ساده و مستقیمتری نوشته و از تعریف نمایندههای سفارشی جلوگیری شود. -
قابلیت استفاده مجدد و خوانایی
استفاده از Func موجب میشود کد خواناتر و قابل استفاده مجدد باشد، به خصوص در موقعیتهایی که نیاز به انجام عملیات مشابهی روی دادههای مختلف داریم. -
ادغام با لینک (LINQ)
بسیاری از توابع لینک از Func برای فیلتر کردن، مرتبسازی و تغییر دادهها استفاده میکنند.
مثال دیگر با LINQ:
List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
Func<int, bool> isOdd = x => x % 2 != 0;
var oddNumbers = numbers.Where(isOdd).ToList();
Console.WriteLine(string.Join(", ", oddNumbers)); // خروجی: 1, 3, 5

مقایسه نمایندههای Action و Func
Action برای متدهایی که بازگشتی ندارند و فقط عملیات اجرایی انجام میدهند مناسب است.
Func برای متدهایی استفاده میشود که مقداری را به عنوان خروجی بازمیگردانند.
برای مثال، اگر بخواهید عملیاتی مانند نمایش پیامی را انجام دهید که نیازی به بازگشت مقدار ندارد، از Action استفاده میکنید؛ اما اگر بخواهید نتیجه یک محاسبه را دریافت کنید، Func مناسبتر است.
نمونهای ترکیبی از استفاده Action و Func
Action<string> printMessage = message => Console.WriteLine(message);
Func<int, int, int> add = (a, b) => a + b;
int result = add(5, 3);
printMessage("Result: " + result); // خروجی: Result: 8
نمایندهها در سیشارپ نقش مهمی در پیادهسازی کدهای پویا و قابلانعطاف دارند و امکان ارسال متدها به عنوان پارامتر، ایجاد انعطافپذیری و استفاده از رویدادها را فراهم میکنند. Func، Action و Predicate از انواع مهم نمایندههای از پیش تعریف شده در سیشارپ هستند که کار با آنها ساده و کاربردی است.
با استفاده از نمایندهها و ترکیب آنها با لینک، میتوانید کدهایی سادهتر و خواناتر بنویسید و از قابلیتهای شیگرایی و داینامیک سیشارپ بهرهمند شوید.
🌟 آیا به دنبال یک فرصت عالی برای یادگیری برنامهنویسی هستید؟ 🚀
با دوره آموزشی سیشارپ ما، شما میتوانید مهارتهای خود را به سطح جدیدی ارتقا دهید! این دوره بهطور کامل طراحی شده تا به شما کمک کند تا از مبتدی تا پیشرفته در دنیای برنامهنویسی سیشارپ پیش بروید.
👨🏫 چرا دوره ما را انتخاب کنید؟
- محتوای جامع و عملی: با پروژههای واقعی و تمرینات عملی، یادگیری را به تجربهای جذاب تبدیل کنید.
- مدرس مجرب: از تجربه و دانش مدرس حرفهای بهرهمند شوید که شما را در هر مرحله از یادگیری راهنمایی میکنند.
- پشتیبانی ۲۴/۷: هر زمان که سوالی داشتید، ما در کنار شما خواهیم بود تا به شما کمک کنیم.
- دسترسی مادامالعمر: به محتوای دوره دسترسی دائمی داشته باشید و هر زمان که خواستید، میتوانید به آن مراجعه کنید.
💡 فرصت را از دست ندهید!
بایادگیری سیشارپ، میتوانید در دنیای فناوری اطلاعات به یک متخصص تبدیل شوید و در پروژههای جذاب و چالشبرانگیز شرکت کنید.
همین امروز به جمع یادگیرندگان ما بپیوندید و اولین قدم را به سوی آیندهای روشنتر بردارید!
مثال پروژهمحور کوتاه از Delegates در سیشارپ
در اینجا یک مثال پروژهمحور کوتاه از Delegates در سیشارپ آورده شده است.
در این مثال، یک سیستم سادهی پرداخت داریم که از نمایندهها (Delegates) برای مدیریت روشهای مختلف پرداخت (پرداخت با کارت اعتباری، پرداخت نقدی و پرداخت با کیف پول دیجیتال) استفاده میکند.
مثال پروژهمحور: سیستم پرداخت با استفاده از Delegates
using System;
class PaymentProcessor
{
// تعریف Delegate برای روش پرداخت
public delegate void PaymentDelegate(double amount);
// متد پردازش پرداخت، با یک delegate به عنوان پارامتر برای نوع پرداخت
public void ProcessPayment(double amount, PaymentDelegate paymentMethod)
{
paymentMethod(amount); // اجرای متد پرداخت با استفاده از Delegate
}
}
// کلاسهای مختلف برای روشهای پرداخت
class PaymentMethods
{
public void CreditCardPayment(double amount)
{
Console.WriteLine($"پرداخت {amount} تومان با کارت اعتباری انجام شد.");
}
public void CashPayment(double amount)
{
Console.WriteLine($"پرداخت {amount} تومان به صورت نقدی انجام شد.");
}
public void DigitalWalletPayment(double amount)
{
Console.WriteLine($"پرداخت {amount} تومان با کیف پول دیجیتال انجام شد.");
}
}
class Program
{
static void Main()
{
PaymentProcessor processor = new PaymentProcessor();
PaymentMethods methods = new PaymentMethods();
// تعریف Delegate ها برای روشهای مختلف پرداخت
PaymentProcessor.PaymentDelegate creditCardDelegate = methods.CreditCardPayment;
PaymentProcessor.PaymentDelegate cashDelegate = methods.CashPayment;
PaymentProcessor.PaymentDelegate digitalWalletDelegate = methods.DigitalWalletPayment;
// انجام پرداخت با استفاده از روشهای مختلف
processor.ProcessPayment(1000, creditCardDelegate); // پرداخت با کارت اعتباری
processor.ProcessPayment(2000, cashDelegate); // پرداخت نقدی
processor.ProcessPayment(3000, digitalWalletDelegate); // پرداخت با کیف پول دیجیتال
}
}
توضیح کد
-
PaymentProcessor: این کلاس شامل متدی به نام ProcessPayment است که از یک نماینده PaymentDelegate برای مشخص کردن نوع پرداخت استفاده میکند.
-
PaymentMethods: این کلاس سه روش مختلف پرداخت (CreditCardPayment، CashPayment، و DigitalWalletPayment) را پیادهسازی میکند.
-
Main: در اینجا، برای هر روش پرداخت یک نماینده (PaymentDelegate) ایجاد شده و سپس از ProcessPayment برای انجام پرداخت با نوع پرداخت مشخص استفاده شده است.
این ساختار به ما امکان میدهد بهراحتی روشهای پرداخت جدیدی اضافه کنیم و سیستم را انعطافپذیرتر کنیم.




کاربران ما
شما هم نظرتون با ما دریاره “Delegates در سی شارپ” اشتراک بزارید
برای ارسال نظر لطفا ورود یا ثبت نام کنید