در این قسمت از وبسایت پرووید آموزش ویدیویی و رایگان کار کردن با Delegate ها در زبان برنامه نویسی سی شارپ را به شما تقدیم میکنیم. در همین ابتدای کار توصیه میکنیم از این آموزش سی شارپ دات نت در ویژوال استادیو دیدن کنید.
یک Delegate چیست؟
یک Delegate به بیان سادده یک Type می باشد که نمایانگر Reference و یا ارجاعی به متدی است که لیست پارامتر ها و Return Type مشخصی که توسط Delegate تعریف میشود را دارند. زمانی که شما یک Delegate را Instantiate می کنید و یا اصطلاحاً از آن یک Object ایجاد میکنید میتوانید آن Instance را با هر متدی که از نظر Signature و البته Return Type با Delegate مورد نظر همخوانی داشته باشد مرتبط کنید. پس از انجام این کار می توانید متد مورد نظر را اصطلاحاً Invoke و یا فراخوانی کنید. این موضوع با استفاده از آن Instance تعریف شده از Delegate مورد نظر انجام میپذیرد. حال ممکن است بپرسید کاربرد Delegate ها در برنامه نویسی چیست و یا به عبارت دیگر چرا نیاز است که بتوانیم به چیزهایی که در برنامه تعریف شدهاند Reference ایجاد کنیم. یکی از کاربردهای استفاده کردن از Delegate ها پاس دادن متدها به عنوان پارامتر ورودی دیگر متدها میباشند.
به بیان دیگر موضوع مربوط به Event ها و Event Handler ها دقیقاً با استفاده از Delegate ها پیاده سازی می شود. در این رابطه توصیه میکنیم از آموزش Event ها، Delegate ها و Lambda Expression ها در سی شارپ دیدن کنید. با استفاده از دیگر Delegate ها و Event ها شما می توانید به سادگی در زن زمان رخ دادن یک Event و یا اصطلاحاً Raise شدن آن، کد موردنظر که توسط Delegate مورد نظرتان ایجاد میشود را اجرا کنید. کدی که در قسمت زیر مشاهده می کنید نحوه تعریف کردن یک Delegate به نام PerformCalculation را نشان میدهد.
public delegate int PerformCalculation(int x, int y);
این متد دو پارامتر ورودی از نوع int دریافت کرده و Return Type و یا نوع خروجی آن از نوع int نیز میباشد. بر همین اساس هر متدی که درون کلاس و یا struct قابل دسترسی باشد، میتواند توسط یک Object از این Delegate مورد ارجاع قرار بگیرند. به عبارت دیگر با تعریف کردن یک آبجکت و یا یک Instance از این Delegate میتوانیم به متد هایی که دو پارامتر ورودی از نوع Int دریافت میکنند و خروجی آنها int نیز میباشد Reference بدهیم. دیگر از قابلیتهای انجام این کار تغییر دادن فراخوانی های متد ها به صورت برنامه نویسی و اجرا کردن کد های جدید و لحاظ کردن آنها در کلاسهای از قبل موجود می باشند. در این رابطه در آموزش پیشرفته برنامه نویسی شی گرا در سی شارپ بیشتر صحبت کردهایم.
نکته بسیار مهم دیگر اینکه در بحث Overload کردن متدها Signature یک متد شامل Return Value و یا نوع داده ای خروجی از آن متد نمی باشد، اما از نقطهن ظر کار کردن با Delegate ها Signature یک متد شامل Return Value آن متد نیز است. به عبارت دیگر یک متد باید Return Type یکسانی نسبت به Delegate مورد نظر داشته باشد. قابلیت Delegate که میتوانند به متد هایی ارجا بدهند آنها را بسیار مناسب برای لحاظ کردن Callback Method ها کرده است. برای مثال یک Object به یک متد که عملیات مقایسه دو مقدار را انجام میدهد میتوانند به عنوان پارامتر ورودی یک متد برای مرتب کردن یک آرایه لحاظ بگردد. از آنجایی که مکانیسم مرتب سازی و مقایسه با یکدیگر گره خورده هستند و کد مربوط به مقایسه کردن مقادیر را میتوان به عنوان پارامتر ورودی الگوریتم مرتبسازی لحاظ کرد، میتوان متد مربوط به مرتب سازی را خیلی ساده تر نوشت. همانطور که گفتیم در رابطه با این موضوع در آموزش پیشرفته برنامه نویسی شی گرا در سی شارپ بیشتر صحبت کردهایم.
در پایان برخی از ویژگی های مربوط به Delegate ها را یک بار دیگر با هم مرور خواهیم کرد.
- Delegate ها در زبان برنامه نویسی سی شارپ شبیه به Function Pointer ها در زبان برنامه نویسی سی پلاس پلاس میباشند. تفاوت ها و Function Pointer ها در این است که Delegate ها بسیار شی گراء تر هستند. به عبارت دیگر در زبان برنامه نویسی سی پلاس پلاس و ماهیت Function Pointer ها فقط میتوانستیم به Member Function ها ارجاع دهیم، این در حالی است که در Delegate ها هم یک Object Instance و هم یک متد کپسول شدهاند.
- Delegate ها اجازه میدهند که متد ها بتوانند به عنوان پارامتر ورودی دیگر متدها لحاظ بگردند.
- با استفاده از Delegate ها به سادگی می توان Callback Method ها را تعریف کرد.
- Delegate می توانند با یکدیگر زنجیر شده و در زمان رخ دادن یک Event تک چندین متد مختلف یکی بعد از دیگری اجرا بگردند.
- متد ها مجبور نیستند با Type مربوط به Delegate مورد نظر همخوانی دقیقی داشته باشند. این موضوع را تحت عنوان Variance مینامیم، که در آموزش سی شارپ دات نت در ویژوال استادیو از آن صحبت کردهایم.
- در زبان برنامه نویسی سی شارپ و ورژن دو مفهوم متد های بی نام و یا Anonymous Method ها تعریف شدند. در Anonymous Method ها میتوان امکان این را لحاظ کرد که یک قسمت از کد به عنوان پارامتر ورودی یک متد دیگر لحاظ بگردد. علاوه بر این موضوع در زبان برنامه نویسی سی شارپ ورژن سوم مفهوم Lambda Expression ها مطرح شد، که به عنوان روشی کوتاه تر برای نوشتن بلاک هایی از کد به صورت Inline لحاظ میگردند. در رابطه با این موضوع در آموزش رایگان لامبدا اکسپرشن Lambda Expression در سی شارپ صحبت کردهایم. اما استفاده کردن از Anonymous Method ها و Lambda Expression ها در بسیاری از شرایط به Delegate ها کامپایل خواهند شد. این سه ماهیت یعنی Anonymous Method ها و Delegate ها و Lambda Expression ها را تحت عنوان Anonymous Function ها میشناسیم.
در این قسمت از وبسایت پرووید آموزش ویدیویی و رایگان Delegate ها را دانلود کرده و از محتوای ارزشمند آموزشی آن استفاده کنید. ضمنا توصیه میکنیم از آموزش Event ها، Delegate ها و Lambda Expression ها در سی شارپ و آموزش رایگان رویداد ها Event در سی شارپ و آموزش رایگان لامبدا اکسپرشن Lambda Expression در سی شارپ دیدن کنید.