delegate در زبان برنامه نویسی سی شارپ، نوعی داده مرجع است که به عنوان الگویی برای متدها عمل میکند. به عبارت سادهتر، delegate در سی شارپ میتواند به یک یا چند متد با امضای یکسان اشاره کند. این مفهوم در بسیاری از موارد برنامهنویسی کاربرد دارد، از جمله رویدادها، فراخوانی متدها به عنوان پارامتر، و استفاده در LINQ.
تعریف delegate در سی شارپ
برای تعریف یک delegate، از کلمه کلیدی delegate استفاده میشود. پس از آن، امضای متد مورد نظر، شامل نوع بازگشتی و لیست پارامترها، مشخص میشود.
به عنوان مثال:
delegate int MyDelegate(int x, int y);
در این مثال، یک delegate به نام MyDelegate تعریف شده است که دو عدد صحیح را به عنوان ورودی میگیرد و یک عدد صحیح را بازمیگرداند.
ایجاد نمونهای از delegate
برای ایجاد یک نمونه از delegate، از عملگر new استفاده میشود. سپس، متدی که با امضای delegate مطابقت دارد، به عنوان آرگومان به سازنده delegate پاس داده میشود. به عنوان مثال:
MyDelegate myDelegate = new MyDelegate(Add); int result = myDelegate(3, 4);
در این مثال، متد Add با امضای MyDelegate مطابقت دارد و به عنوان آرگومان به سازنده delegate پاس داده شده است. سپس، نمونه delegate به متغیر myDelegate اختصاص داده میشود. در نهایت، با فراخوانی myDelegate، متد Add اجرا میشود و نتیجه آن به متغیر result اختصاص داده میشود.
چندریختی delegate (Multicasting)
یکی از ویژگیهای مهم delegate، امکان اشاره به چندین متد است. این ویژگی به عنوان چندریختی delegate شناخته میشود. برای افزودن یک متد جدید به یک delegate، از عملگر += استفاده میشود. به عنوان مثال:
myDelegate += Subtract;
در این مثال، متد Subtract نیز به delegate myDelegate اضافه شده است. هنگام فراخوانی delegate، هر دو متد به ترتیب اجرا میشوند.
پیشنهاد مطالعه: آموزش Async و Await در سی شارپ با مثالهای عملی
کاربردهای delegate در سی شارپ
delegateها در بسیاری از زمینههای برنامهنویسی کاربرد دارند. برخی از مهمترین کاربردهای آنها عبارتند از:
- رویدادها: delegateها برای پیادهسازی رویدادها استفاده میشوند. یک رویداد در واقع یک delegate است که به یک یا چند متد (handler) اشاره میکند.
- فراخوانی متد به عنوان پارامتر: delegateها میتوانند به عنوان پارامتر به متدها پاس داده شوند. این امکان را فراهم میکند که رفتار یک متد را در زمان اجرا تغییر دهیم.
- LINQ: delegateها در زبان پرس و جوی LINQ به طور گسترده استفاده میشوند. برای فیلتر کردن، مرتبسازی و سایر عملیات روی مجموعه دادهها، از delegateها استفاده میشود.
Delegateها و Predicate در سی شارپ
Predicate یک delegate خاص است که یک ورودی از نوع T میگیرد و یک مقدار بولین بازمیگرداند. از Predicate برای فیلتر کردن دادهها استفاده میشود. به عنوان مثال:
Predicate isEven = number => number % 2 == 0;
در این مثال، یک Predicate به نام isEven تعریف شده است که بررسی میکند آیا یک عدد زوج است یا خیر.
استفاده از Predicate در LINQ
Predicateها در LINQ برای فیلتر کردن دادهها استفاده میشوند. به عنوان مثال:
List numbers = new List { 1, 2, 3, 4, 5 }; var evenNumbers = numbers.Where(isEven);
در این مثال، از متد Where برای فیلتر کردن اعداد زوج از لیست numbers استفاده شده است.
Delegateها و Func در سی شارپ
Func یک delegate عمومی است که ورودیهای دلخواه و یک خروجی از نوع دلخواه را میپذیرد. از Func برای انجام عملیات روی دادهها استفاده میشود. به عنوان مثال:
Funcadd = (x, y) => x + y;
در این مثال، یک Func به نام add تعریف شده است که دو عدد صحیح را به عنوان ورودی میگیرد و حاصل جمع آنها را بازمیگرداند.
استفاده از Func در LINQ
Funcها در LINQ برای انجام عملیات روی دادهها استفاده میشوند. به عنوان مثال:
List numbers = new List { 1, 2, 3, 4, 5 }; var doubledNumbers = numbers.Select(number => number * 2);
در این مثال، از متد Select برای ضرب هر عدد در لیست numbers در 2 استفاده شده است.
مثال عملی delegate در سی شارپ: یک سناریو ساده
فرض کنید میخواهیم برنامهای بنویسیم که بتواند عملیاتهای مختلفی روی اعداد انجام دهد، مثلاً جمع، ضرب، تفریق و تقسیم. به جای اینکه برای هر عملیات یک تابع جداگانه بنویسیم، میتوانیم از delegate استفاده کنیم تا یک تابع عمومی تعریف کنیم که بتواند هر یک از این عملیات را انجام دهد.
قدم اول: تعریف delegate
delegate int MyMathOperation(int a, int b);
در اینجا، ما یک delegate به نام MyMathOperation تعریف کردیم. این delegate یک تابع را نشان میدهد که دو عدد صحیح را به عنوان ورودی میگیرد و یک عدد صحیح را به عنوان خروجی برمیگرداند.
قدم دوم: تعریف توابع عملیات
int Add(int x, int y) { return x + y; } int Subtract(int x, int y) { return x - y; } // ... توابع دیگر برای ضرب و تقسیم
در این مرحله، توابع مختلفی برای انجام عملیاتهای ریاضی تعریف میکنیم. هر کدام از این توابع با امضای delegate MyMathOperation مطابقت دارند.
قدم سوم: استفاده از delegate
MyMathOperation operation; // برای جمع: operation = Add; int result = operation(5, 3); Console.WriteLine(result); // خروجی: 8 // برای تفریق: operation = Subtract; result = operation(5, 3); Console.WriteLine(result); // خروجی: 2
در این بخش، ما یک متغیر از نوع MyMathOperation به نام operation تعریف میکنیم. سپس، با برابر قرار دادن operation با تابع Add، میتوانیم از آن برای انجام عمل جمع استفاده کنیم. به همین ترتیب، با برابر قرار دادن operation با تابع Subtract، میتوانیم از آن برای انجام عمل تفریق استفاده کنیم.
شرح ساده:
- delegate مثل یک جعبه است که میتوانیم یک تابع را در آن قرار دهیم.
- ما یک جعبه (delegate) به نام MyMathOperation ساختیم که فقط توابعی را میپذیرد که دو عدد را گرفته و یک عدد را برمیگردانند.
- توابع Add و Subtract را ساختیم که هر دو با شرایط جعبه ما مطابقت دارند.
- سپس، تابع مورد نظر را داخل جعبه قرار دادیم و از جعبه استفاده کردیم تا تابع را اجرا کنیم.
مزایای استفاده از delegate:
- انعطافپذیری: میتوانیم به راحتی عملیاتهای مختلف را با استفاده از یک delegate انجام دهیم.
- کاهش کد تکراری: نیازی به نوشتن کد تکراری برای هر عملیات نیست.
- افزایش خوانایی کد: کد تمیزتر و قابل فهمتر میشود.
کاربردهای دیگر delegate:
- رویدادها: delegateها در پیادهسازی رویدادها در سی شارپ استفاده میشوند.
- LINQ: delegateها در LINQ برای فیلتر کردن، مرتبسازی و سایر عملیات روی مجموعه دادهها استفاده میشوند.
- فراخوانی متد به عنوان پارامتر: میتوان delegateها را به عنوان پارامتر به متدها پاس داد.
نکته:
- delegateها ابزاری قدرتمند برای برنامهنویسی هستند و درک آنها برای نوشتن کدهای بهتر و انعطافپذیرتر ضروری است.
- با تمرین بیشتر و مطالعه مثالهای مختلف، میتوانید به خوبی با delegateها آشنا شوید.
پیشنهاد مطالعه: آموزش Entity Framework سی شارپ – راهنمای ساده و سریع
Delegateها و Action در سی شارپ
Action یک delegate عمومی است که ورودیهای دلخواه میپذیرد اما خروجی ندارد. از Action برای انجام عملیات بدون بازگشت نتیجه استفاده میشود. به عنوان مثال:
Action printMessage = message => Console.WriteLine(message);
در این مثال، یک Action به نام printMessage تعریف شده است که یک رشته را به عنوان ورودی میگیرد و آن را روی کنسول چاپ میکند.
سوالات متداول در مورد delegate در سی شارپ
- تفاوت بین delegate و interface چیست؟ delegate یک نوع داده مرجع است که به عنوان الگویی برای متدها عمل میکند، در حالی که interface یک قرارداد است که کلاسها باید پیادهسازی کنند.
- چگونه میتوان از delegate برای ایجاد رویداد استفاده کرد؟ برای ایجاد رویداد، یک delegate تعریف کنید و سپس از آن برای انتشار رویداد استفاده کنید. کلاسهای دیگر میتوانند به این رویداد مشترک شده و متدهای handler خود را اضافه کنند.
- آیا میتوان از delegate برای ایجاد متدهای بازگشتی استفاده کرد؟ بله، delegateها میتوانند برای ایجاد متدهای بازگشتی استفاده شوند. برای این کار، نوع بازگشتی delegate را مشخص کنید.
- چه زمانی باید از delegate استفاده کرد؟ از delegateها زمانی استفاده کنید که نیاز دارید به یک یا چند متد با امضای یکسان اشاره کنید، یا زمانی که میخواهید متدها را به عنوان پارامتر به متدهای دیگر پاس دهید.
- آیا delegateها میتوانند به متدهای استاتیک اشاره کنند؟ بله، delegateها میتوانند به متدهای استاتیک اشاره کنند.
کلام پایانی
delegateها یکی از مفاهیم مهم در زبان برنامهنویسی سی شارپ هستند. آنها امکان تعریف الگوهای برای متدها، استفاده از آنها در رویدادها، فراخوانی متدها به عنوان پارامتر و استفاده در LINQ را فراهم میکنند. با درک کامل delegateها، میتوانید کدهای خود را به صورت موثرتر و انعطافپذیرتر بنویسید.
آیا به دنبال یادگیری یکی از پرکاربردترین زبانهای برنامهنویسی دنیا هستید؟ دورههای جامع آموزش سی شارپ و آموزش برنامه نویسی مکتب خونه، با تدریس اساتید مجرب و محتوای بروز، بهترین مسیر برای تسلط بر این زبان قدرتمند است. همین حالا ثبتنام کنید و قدم اول برای ساخت آینده شغلی درخشان خود بردارید!
منبع