Delegate ها در سی شارپ دقیقا کجا استفاده میشن ؟
من Syntax و مثال های مربوط به دلیگیت رو توی اینترنت و ویدیو های آموزشی و کتاب سی شارپ هم دیدم
چیزی که تقریبا متوجه شدم همون Pointer ها در C++/C هست و مثل یک نماینده برای توابع (متد ها) عمل میکنه , Delegate ها میتونند یک لیستی از توابع در خودش داشته باشه و به جای صدا زدن مستقیم توابع از اونها استفاده کنیم .
اما مشکل اینه که متوجه نمیشم که اگر توی سی شارپ ما Delegate نداشتیم چه مشکلی پیدا میکردیم , یا مثال کاربردی و واقعی اون رو ندیدم ,
چی میشه اگه به جای این کار , میتونیم کد نویسی تمیز داشته باشیم و توابع مون رو توی یک کلاس مشخص داشته باشیم و همون ها رو صدا بزنیم !
چون با اینکه دارم روی یک برنامه حسابداری کار مکینم جایی نیاز به همچین چیزی پیدا نکردم .
توی این مثال یک تابع داریم که عدد رو میگیره و 10 تا بهش اضافه میکنه برمیگردونه , یکبار اون رو به عنوان Delegate پاس کردم , یکبار یک تابع دیگرو مستقیما بهش پاس کردم
class Program
{
// Delegate of Sum Function
public delegate int Sum_Func_dlg(int Num1);
static void Main(string[] args)
{
#region Using The Delegate as input parameter to a Function(Method)
Console.WriteLine("Delegate :");
//Bind Sum Function to it's Delegate
Sum_Func_dlg sumfunc = Sum_Function;
Console.WriteLine
(
Sum_Function(sumfunc(2))
);
#endregion
#region Using Function as parameter directly !
Console.WriteLine("Function as Paramter :");
Console.WriteLine
(
Sum_Function(Fifty_Function())
);
#endregion
Console.ReadKey();
}
public static int Sum_Function(int Num1)
{
return Num1 + 10;
}
public static int Fifty_Function()
{
return 50;
}
}
بازم متوجه نشدم چه فایده ای داره ؟!
این لینک ها هم کمک میکنه ولی باز جوابم رو نمیده:
1- Why does trying to understand delegates feel like trying to understand the nature of the universe?
اگر امکانش هست لطفا به زبون خیلی ساده با یک مثال مفهموی از هدف اصلی دیلیگیت ها کمک کنه بتونم این موضوع رو متوجه بشم eli5 (Explain Like I'm Five)
باتشکر
پاسخ هوش مصنوعی
Delegate ها در سی شارپ ابزارهای مهمی هستند که به شما این امکان را می دهند تا توابع را به عنوان پارامتر به دیگر توابع ارسال کنید و یا توابع را به متغیرها انتساب دهید. این ویژگی مشابه به "Pointer" ها در C++ است، اما با ایمنی و راحتی بیشتر.
دلیل استفاده از Delegate ها این است که به شما اجازه می دهند رفتارهای مختلف را به راحتی و به صورت پویا به کد خود اضافه کنید. در واقع Delegate ها به شما این امکان را می دهند که از الگوی طراحی "Callback" استفاده کنید، که یک روش متداول برای مدیریت رویدادها یا اجرای توابع مختلف است.
در مواردی که شما نیاز به انجام کارهایی دارید که باید به یک رویداد خاص یا مجموعه ای از توابع پاسخ دهند، Delegate ها بسیار مفید خواهند بود. به عنوان مثال، در برنامه نویسی واسط کاربری (UI)، شما ممکن است بخواهید یک تابع خاص را به عنوان پاسخ به یک کلیک دکمه تعیین کنید. با استفاده از Delegate ها، می توانید به راحتی این عمل را انجام دهید.
به عنوان یک مثال ساده، فرض کنید که شما یک تابع دارید که یک عمل خاص مانند ثبت نام کاربر را انجام می دهد و شما می خواهید به برخی از کارها پس از اتمام این عمل توجه کنید. با استفاده از Delegate ها، شما می توانید چندین تابع را به یک Delegate متصل کنید که بعد از اتمام فعل ثبت نام اجرا شوند.
در زیر یک نمونه از کلاس ثبت نام را مشاهده می کنید که از Delegate ها استفاده می کند:
using System;
class Program
{
// تعریف Delegate
public delegate void RegistrationCompletedHandler(string message);
// رویداد که زمانی که ثبت نام کامل می شود، فراخوانی می شود
public static event RegistrationCompletedHandler RegistrationCompleted;
static void Main(string[] args)
{
// متصل کردن تابع به رویداد
RegistrationCompleted += SendConfirmationEmail;
RegisterUser("John Doe");
Console.ReadKey();
}
// تابع ثبت نام کاربر
static void RegisterUser(string userName)
{
// منطق ثبت نام کاربر
Console.WriteLine($"User {userName} registered successfully.");
// فراخوانی رویداد پس از اتمام ثبت نام
RegistrationCompleted?.Invoke("Registration completed for " + userName);
}
// تابعی که به رویداد متصل است
static void SendConfirmationEmail(string message)
{
Console.WriteLine($"Email sent: {message}");
}
}
در این مثال، وقتی که تابع RegisterUser
به پایان می رسد، رویداد RegistrationCompleted
فعال می شود و به صورت پویا تابع SendConfirmationEmail
به آن متصل شده است. این به شما این امکان را می دهد که چندین رفتار (تابع) متفاوت را به راحتی به یک رویداد متصل کنید بدون اینکه نیاز به ویرایش منطق اصلی تابع RegisterUser
داشته باشید.
اگر Delegate ها وجود نداشتند، شما باید این کارها را با استفاده از کلاس ها و متدهای اضافی انجام دهید که باعث پیچیدگی و دست و پا گیری کد می شود. Delegate ها روشی ساده، تمیز و قابل خواندن برای مدیریت رفتارهای مختلف فراهم می کنند.
ببین در واقع Delegate نوعی از تعریف تابع هست. یعنی یه خاصیتی نیست که استفاده از اون اجباری باشه. به هر حال مهندسین مایکروسافت این نوع از نگاه به توابع و متدها رو هم طراحی کردن.
Delegate در سی شارپ چیست ؟
delegate رو چند مدل میشه تعریف کرد. بستگی داره چجوری بهش نگاه کنید. وقتی شما متدی دارید که درون اون میخواید متدهای دیگه ای رو استفاده کنید و یا وقتی از یک متد به عنوان یک DataType در متدهای دیگه میخواید استفاده کنید.
ببین استفاده از delegate در واقع باعث انعطاف پذیری چارچوب ساختار پروژه شما میشه (البته اگر از پیچیدگی هایی که ایجاد میشه بتونید به سلامت عبور کنید!!) کلا مثال خوبی از استفاده از delegate تو نت نیست. اکثر سایتها اومدن یه سری توضیحات دادن و نهایتا یک مثال ساده زدن. کلا یه جور نگاه سطح بالا از برنامه نویسی و پیاده سازی توابع و متدهاست . بنظرم زیاد خودتو درگیرش نکن.
ممنونم.فکر میکنم در حالت عادی به این موضوع برخورد نمیکنیم, توی کار های خاص ممکنه به کار بیاد
ولی ظاهرا همون ref [variable] هست منتهی به جای متغیر میاد سراغ متد ها (توابع) چیزی که توی Pointer ها در C++ یا پاسکال هست.
این یه مثال عملیش هست که هدفش اینه که بتونیم از طریق LINQ شرطی رو برای Select خودمون به تابع Get (تابعی که خودمون ساختیم و در حالت عادی کل دیتا ها رو از دیتابیس میاره) بفرستیم :
public class GenericRepository<TEntity> where TEntity:class
{
private Accounting_DBEntities _db;
private DbSet<TEntity> _dbSet;
public GenericRepository(Accounting_DBEntities db)
{
_db = db;
_dbSet = _db.Set<TEntity>();
}
// LINQاستفاده از دلیگیت ها آماده سی شارپ برای ارسال
public virtual IEnumerable<TEntity> Get(Expression<Func<TEntity,bool>> where=null)
{
IQueryable<TEntity> query = _dbSet;
if (where != null)
{
query = query.Where(where);
}
return query.ToList();
}
public virtual TEntity GetById(object Id)
{
return _dbSet.Find(Id);
}
}
نتیجه کار :
بازم برای خودم جا نیوفتاد که خودمون دقیقا چجوری میتونیم از Delegate بسازیم که بدرمون بخوره بیشتر فکر میکنم کد مون رو پیچیده تر میکنه
- آموزش استفاده از پلاگین گردونه شانس در Asp.net core به همراه سورس
- نمایش متن به صورت فرمت شده در CkEditor
- آموزش استفاده از SignalR در Asp.net Core با مثال عملی
- ادغام چند گزارش استیمول سافت بصورت پی دی اف در یک فایل
- نحوه تغییر استایل کامپوننت select2 چگونه است ؟
- چگونه امنیت پروژه را در Asp.net Core افزایش دهیم ؟
- ارسال پارامتر در دستور window.open جی کویری
- ارسال پارامتر از طریق جاوااسکریپت با کلیک روی تگ a
- خطای 500 زمان اجرا شدن پروژه روی هاست
- کویری نویسی در استیمول سافت جهت فیلتر اطلاعات
- مشکل تاریخ شمسی در سی شارپ
- نمایش گزارش stimulsoft روی کلاینت
- تفاوت های سی شارپ 8 با نسخه های قبلی چیه؟
- انتخاب چند سطر دلخواه توسط چک باکس در DataGrid و محاسبه جمع سطرهای انتخاب شده
- نمایش نوتیفکیشن در سی شارپ
- ارسال پارامتر از سی شارپ به استیمول سافت
- عدم نمایش عکس در دیتاگرید ویو در wpf
- Library Animation برای کنترلهای WPF
- مشکل در تغییر مقدار Text کنترل RibbonBar در کامپوننت DevExpress
- قرار دادن مقادیر ارسالی یک ستون از جدول به صورت سطری در استیمول