دسته بندی ها
14:15 1401/02/14

Delegate ها در سی شارپ دقیقا کجا استفاده میشن ؟

مشخصات سوال کننده :
کاربر : mojtabahakimian     امتیاز کاربر : 155     رتبه کاربر : 10
دسته بندی : سی شارپ C++

به این سوال امتیاز بدهید    0
تعداد بازدید این سوال : 2706
4 نظر
mojtabahakimian : آیا هیچکس نظری داره ؟

امتیاز کاربر : 155   رتبه کاربر : 10   تاریخ ثبت : 00:12 1401/02/15
pedram_khan : منم یه مدت روی این موضوع تحقیق میکردم. آخرشم نفهمیدم دقیقا چیه و چه کاربردی داره

امتیاز کاربر : 277   رتبه کاربر : 6   تاریخ ثبت : 11:17 1401/02/15
gholamei : دوستان گرامی دلیگیت یک ویژگی کاملاً قدرتمند در سی شارپ هست و در واقع تمام Eventها یک نوع دلیگیت هستند یا نوع تکامل یافت دلیگیت به حساب می ایند. فرض کنید شما بخواهید برنامه ای بنویسید که حداقل 20 تا فرم داشته باشه و لازم باشه در هر ثانیه یک مقدار که معمولا از کاربر گرفته میشه در تمام این فرم ها فراخوانی بشه. بهترین راه استفاده از دلیگیت هست. بدون استفاده از دلیگیت شما مجبور هستید به شدت کدهای پیچیده تری بنویسد و کوچکترین تغییر در برنامه خیلی سخت باشه. دلیگیت در ابتدای یادگیری کمی پیچیده است اما بسیار قدرتمند و کاربردی است.

امتیاز کاربر : 0   رتبه کاربر : 7065   تاریخ ثبت : 08:37 1401/03/11
mojtabahakimian : mojtabahakimian : میشه لطفا مثال کامل و دقیق این رو بنویسید دلیگیت توی حالت خاص به کار میاد , خیلی از برنامه نویس های حرفه ای هم حتی با این موضوع آشنا نیستند , Pointer در ++C رو میدونند ولی این فرق میکنه

امتیاز کاربر : 155   رتبه کاربر : 10   تاریخ ثبت : 10:10 1401/03/12
ادامه نظرات ...
هوش مصنوعی

پاسخ هوش مصنوعی

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 ها روشی ساده، تمیز و قابل خواندن برای مدیریت رفتارهای مختلف فراهم می کنند.

به این پاسخ امتیاز بدهید    0
امتیاز: - رتبه: -
پاسخ دهنده : fateme 00:33 1401/02/16

ببین در واقع Delegate نوعی از تعریف تابع هست. یعنی یه خاصیتی نیست که استفاده از اون اجباری باشه. به هر حال مهندسین مایکروسافت این نوع از نگاه به توابع و متدها رو هم طراحی کردن.

 

Delegate در سی شارپ چیست ؟

delegate رو چند مدل میشه تعریف کرد. بستگی داره چجوری بهش نگاه کنید. وقتی شما متدی دارید که درون اون میخواید متدهای دیگه ای رو استفاده کنید و یا وقتی از یک متد به عنوان یک DataType در متدهای دیگه میخواید استفاده کنید.

ببین استفاده از delegate در واقع باعث انعطاف پذیری چارچوب ساختار پروژه شما میشه (البته اگر از پیچیدگی هایی که ایجاد میشه بتونید به سلامت عبور کنید!!) کلا مثال خوبی از استفاده از delegate تو نت نیست. اکثر سایتها اومدن یه سری توضیحات دادن و نهایتا یک مثال ساده زدن. کلا یه جور نگاه سطح بالا از برنامه نویسی و پیاده سازی توابع و متدهاست . بنظرم زیاد خودتو درگیرش نکن.

ویرایش شده در جمعه 16 اردیبهشت 1401 ساعت 00:34:58
به این پاسخ امتیاز بدهید    1
امتیاز: 1635 رتبه: 2
پاسخ دهنده : mojtabahakimian 03:51 1401/02/16

ممنونم.فکر میکنم در حالت عادی به این موضوع برخورد نمیکنیم, توی کار های خاص ممکنه به کار بیاد

ولی ظاهرا همون 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 بسازیم که بدرمون بخوره بیشتر فکر میکنم کد مون رو پیچیده تر میکنه 

به این پاسخ امتیاز بدهید    0
امتیاز: 155 رتبه: 10
برای ارسال پاسخ لطفا وارد حساب کاربری خود شوید.   ورود