من 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 نوعی از تعریف تابع هست. یعنی یه خاصیتی نیست که استفاده از اون اجباری باشه. به هر حال مهندسین مایکروسافت این نوع از نگاه به توابع و متدها رو هم طراحی کردن.
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 بسازیم که بدرمون بخوره بیشتر فکر میکنم کد مون رو پیچیده تر میکنه
تاریخ :
1402/09/08
- ساعت :
07:34:00 PM
- بازدید :
1157
- پاسخ :
1
|
تاریخ :
1402/09/21
- ساعت :
11:10:00 PM
- بازدید :
595
- پاسخ :
1
|
تاریخ :
1403/07/13
- ساعت :
12:06:00 PM
- بازدید :
346
- پاسخ :
1
|
تاریخ :
1403/06/24
- ساعت :
08:52:00 PM
- بازدید :
314
- پاسخ :
1
|
تاریخ :
1398/09/14
- ساعت :
01:58:00 PM
- بازدید :
4263
- پاسخ :
1
|
تاریخ :
1403/05/16
- ساعت :
05:43:00 AM
- بازدید :
654
- پاسخ :
0
|
تاریخ :
1398/09/05
- ساعت :
06:04:00 PM
- بازدید :
3170
- پاسخ :
2
|
تاریخ :
1398/09/08
- ساعت :
11:38:00 PM
- بازدید :
3250
- پاسخ :
1
|
تاریخ :
1403/04/12
- ساعت :
07:27:00 PM
- بازدید :
657
- پاسخ :
0
|
تاریخ :
1403/01/29
- ساعت :
08:08:00 AM
- بازدید :
685
- پاسخ :
4
|
تاریخ :
1403/08/29
- ساعت :
07:15:00 PM
- بازدید :
58
- پاسخ :
0
|
تاریخ :
1403/08/18
- ساعت :
10:40:00 AM
- بازدید :
99
- پاسخ :
0
|
تاریخ :
1402/07/23
- ساعت :
04:01:00 PM
- بازدید :
1031
- پاسخ :
1
|
تاریخ :
1403/05/30
- ساعت :
09:22:00 AM
- بازدید :
426
- پاسخ :
1
|
تاریخ :
1402/08/01
- ساعت :
06:25:00 PM
- بازدید :
930
- پاسخ :
1
|
تاریخ :
1402/08/16
- ساعت :
10:38:00 AM
- بازدید :
1348
- پاسخ :
1
|
تاریخ :
1398/08/17
- ساعت :
01:27:00 AM
- بازدید :
4796
- پاسخ :
1
|
تاریخ :
1402/09/08
- ساعت :
07:34:00 PM
- بازدید :
1157
- پاسخ :
1
|
تاریخ :
1402/09/21
- ساعت :
11:10:00 PM
- بازدید :
595
- پاسخ :
1
|
تاریخ :
1403/07/27
- ساعت :
03:21:00 PM
- بازدید :
205
- پاسخ :
1
|