چهارشنبه ۲۱ آبان ۹۹ | ۱۲:۵۱ ۲۱ بازديد
Delegate در زبان برنامهنویسی #C همانند اشارهگرها در توابع C و ++C است. یک delegate معرف یک متغییر نوع مرجع (Reference Type Variable) بوده که ارجاع به یک متد را در خود ذخیره میکند و این ارجاع در طی اجرای برنامه ممکن است تغییر کند.
از نظر نوع دقیقا مشابه interfaceها است. Delegateها به خصوص برای پیادهسازی Eventها و متدهای call-back (بازگشتی) بسیار مفید میباشند. تمام delegateها به صورت implicit از کلاس System.Delegate مشتق شدهاند. ممکن است این سوال برای شما پیش بیاید که چرا نیاز داریم که یک ارجاع به یک متد داشته باشیم؟ در پاسخ به این سوال باید بگوییم که با استفاده از این کار حداکثر انعطافپذیری برای اجرای هرگونه عملکردی را در زمان اجرا بدست میآورید.
مزایای استفاده از delegateها
۱) یک نماینده یا delegate به نوع static (بدون ساخت شیء) یا nonStatic (همراه با ساخت شیء) توجهی نمیکند.
۲) مدیریت کردن عملیاتها و اجرای هر یک از آنها هنگام بروز یک رویداد مشخص
تعریف Delegate
تعریف کردن Delegate باید دقت کرد که نوع متد مورد نظر ما باید با نوع Delegate ما مطابقت داشته باشد. یعنی اگر Signature متد ما از نوع int باشد باید Delegate ما نیز از نوع int تعریف شود. برای مثال، Delegate زیر را در نظر بگیرید :
نمونه سازی Delegate ها
وقتی که یک Delegate تعریف میشود، یک از آن نیز باید توسط کلمه کلیدی new ایجاد شود و نام متد مورد نظر ما به عنوان پارامتر به آن داده شود. توجه داشته باشید که در این قسمت نباید متد را با پرانتز یا آرگومان به Delegate پاس بدهید. مثال زیر را ببینید:
Delegate ها دارای ویژگی های زیر می باشند:
1. delegate ها در C# مشابه pointer ها در C++ هستند اما بر خلاف آن ها TYPE SAFE بوده و کاربر را مستقیما با خانه های حافظه درگیر نمی کنند. به عبارت دیگر از رخداد خطاهای مربوط به نوع داده ای در برنامه جلوگیری می کند.
2. در این قسمت از آموزش C#توسط Delegate ها به توابع این امکان را می دهند تا خود به عنوان پارامتر به توابع دیگر فرستاده شوند.
3. می توان با استفاده از delegate ها، متدهای بازفراخوان یا callback تعریف کرد.
4. delegate ها را می توان به صورت زنجیره ای و پشت سرهم فراخوانی کرد. برای مثال چندین متد به هنگام اتفاق افتادن یک event یا رخداد صدا خورده شوند.
5. لزومی ندارد متدها و delegate ها از لحاظ نوع پارامتر ورودی، ترتیب و تعداد آن ها (signature) با هم برابر باشند.
6. توسعه دهنده می تواند به کمک این الگو توسعه، یک اشاره گر (reference) به متد مورد نظر را داخل آبجکت delegate کپسوله سازی کند. آبجکت delegate سپس به راحتی قابل ارسال به کدی است که می تواند متد مورد اشاره را صدا بزند، از این طریق دیگر لازم نیست در زمان کامپایل متد مورد فراخوانی دقیقا مشخص شود.
7. یکی از ویژگی های جالب توجه و کاربردی delegate ها این است که برایشان اهمیت ندارد که آبجکتی که به آن اشاره می کنند، از جنس کدام کلاس می باشد. کافی است نوع آرگومان های ورودی و خروجی آبجکت مورد نظر با آرگومان های ورودی و خروجی delegate منطبق باشند. این قابلیت سبب فراخوانی آسان کد anonymous (توابع بی نام یا anonymous) می شود.
کلام آخر:
در این مقاله به طور مختصر در مورد دلیگیت ها در سی شارپ صحبت شد اگر می خواهید به طور کامل و جامع این موضوع را یادبگیرید می توانید از آموزش سی شارپ پیشرفته استفاده کنید.
در این دوره به طور کامل در مورد دلیگیت ها توضیح داده شده است.
از نظر نوع دقیقا مشابه interfaceها است. Delegateها به خصوص برای پیادهسازی Eventها و متدهای call-back (بازگشتی) بسیار مفید میباشند. تمام delegateها به صورت implicit از کلاس System.Delegate مشتق شدهاند. ممکن است این سوال برای شما پیش بیاید که چرا نیاز داریم که یک ارجاع به یک متد داشته باشیم؟ در پاسخ به این سوال باید بگوییم که با استفاده از این کار حداکثر انعطافپذیری برای اجرای هرگونه عملکردی را در زمان اجرا بدست میآورید.
مزایای استفاده از delegateها
۱) یک نماینده یا delegate به نوع static (بدون ساخت شیء) یا nonStatic (همراه با ساخت شیء) توجهی نمیکند.
۲) مدیریت کردن عملیاتها و اجرای هر یک از آنها هنگام بروز یک رویداد مشخص
تعریف Delegate
تعریف کردن Delegate باید دقت کرد که نوع متد مورد نظر ما باید با نوع Delegate ما مطابقت داشته باشد. یعنی اگر Signature متد ما از نوع int باشد باید Delegate ما نیز از نوع int تعریف شود. برای مثال، Delegate زیر را در نظر بگیرید :
;(public delegate int MyDelegate (string s
نمونه سازی Delegate ها
وقتی که یک Delegate تعریف میشود، یک از آن نیز باید توسط کلمه کلیدی new ایجاد شود و نام متد مورد نظر ما به عنوان پارامتر به آن داده شود. توجه داشته باشید که در این قسمت نباید متد را با پرانتز یا آرگومان به Delegate پاس بدهید. مثال زیر را ببینید:
;(public delegate void printString(string s
...
;(printString ps1 = new printString(WriteToScreen
;(printString ps2 = new printString(WriteToFile
Delegate ها دارای ویژگی های زیر می باشند:
1. delegate ها در C# مشابه pointer ها در C++ هستند اما بر خلاف آن ها TYPE SAFE بوده و کاربر را مستقیما با خانه های حافظه درگیر نمی کنند. به عبارت دیگر از رخداد خطاهای مربوط به نوع داده ای در برنامه جلوگیری می کند.
2. در این قسمت از آموزش C#توسط Delegate ها به توابع این امکان را می دهند تا خود به عنوان پارامتر به توابع دیگر فرستاده شوند.
3. می توان با استفاده از delegate ها، متدهای بازفراخوان یا callback تعریف کرد.
4. delegate ها را می توان به صورت زنجیره ای و پشت سرهم فراخوانی کرد. برای مثال چندین متد به هنگام اتفاق افتادن یک event یا رخداد صدا خورده شوند.
5. لزومی ندارد متدها و delegate ها از لحاظ نوع پارامتر ورودی، ترتیب و تعداد آن ها (signature) با هم برابر باشند.
6. توسعه دهنده می تواند به کمک این الگو توسعه، یک اشاره گر (reference) به متد مورد نظر را داخل آبجکت delegate کپسوله سازی کند. آبجکت delegate سپس به راحتی قابل ارسال به کدی است که می تواند متد مورد اشاره را صدا بزند، از این طریق دیگر لازم نیست در زمان کامپایل متد مورد فراخوانی دقیقا مشخص شود.
7. یکی از ویژگی های جالب توجه و کاربردی delegate ها این است که برایشان اهمیت ندارد که آبجکتی که به آن اشاره می کنند، از جنس کدام کلاس می باشد. کافی است نوع آرگومان های ورودی و خروجی آبجکت مورد نظر با آرگومان های ورودی و خروجی delegate منطبق باشند. این قابلیت سبب فراخوانی آسان کد anonymous (توابع بی نام یا anonymous) می شود.
کلام آخر:
در این مقاله به طور مختصر در مورد دلیگیت ها در سی شارپ صحبت شد اگر می خواهید به طور کامل و جامع این موضوع را یادبگیرید می توانید از آموزش سی شارپ پیشرفته استفاده کنید.
در این دوره به طور کامل در مورد دلیگیت ها توضیح داده شده است.