آموزش و معرفی Delegate ها - دلیگیت چیست؟
دلیگیت ها در C# در واقع اشاره گری به متدها هستند. کاربرد اصلی آن جایی است که میخواهیم قطعه کدی را اجرا کنیم اما تا زمان اجرای برنامه آن قطعه کد مشخص نیست کدام قسمت از برنامه است.
Delegate ها در C# شبیه به اشاره گرها در C یا C++ هستند. یک delegate متغیر نوع مرجع است که ارجاعی به یک متد نگه می دارد. ارجاع می تواند در زمان اجرا تغییر کند.
Delegate ها به خصوص برای پیاده سازی event ها و متدهای call-back استفاده می شوند. همه delegate ها به طور صریح از کلاس System.Delegate مشتق می شوند.
اعلان Delegate ها
اعلان Delegate متدهایی را که می توانند توسط delegate مورد رجوع قرار بگیرند را تعیین می کند. یک delegate می تواند به یک متد رجوع کند که دارای امضای یکسانی از آن delegate باشد.
برای مثال delegate زیر را در نظر بگیرید:
public delegate int MyDelegate(string s);
Delegate تعریف شده می تواند برای ارجاع به هر متدی که دارای یک پارامتر string بوده و یک خروجی int دارد استفاده شود.
Syntax برای اعلان delegate به صورت زیر است:
delegate <return type> <delegate-name> <parameter list>
ایجاد نمونه (instance) از Delegate
یکبار که delegate type اعلان شد، یک شی delegate باید با کلمه کلیدی new ایجاد شود و به یک متد خاص مرتبط شود. زمان ایجاد یک delegate آرگومان پاس شده به new expression مشابه با فراخوانی متد نوشته می شود اما بدون آرگومان. برای مثال:
public delegate void printString(string s);
...
printString ps1 = new printString(WriteToScreen);
printString ps2 = new printString(WriteToFile);
مثال زیر اعلان، نمونه سازی و استفاده از delegate را نشان می دهد که می تواند برای متدهای مرجع که یک پارامتر صحیح می گیرند و یک مقدار صحیح بر میگردانند استفاده شود. متدهایی که delegate به آنها رجوع می کند باید از نوع static باشند.
بعد از compile و اجرای کد فوق خروجی زیر ظاهر می شود:
Value of Num: 35
Value of Num: 175
MultiCast Delegate (ترکیب دلیگیت)
اشیا delegate می توانند با استفاده از عملگر + ترکیب شوند. یک delegate ترکیب شده دو delegate را که از آنها ترکیب شده فراخوانی می کند. فقط delegate های هم نوع می توانند ترکیب شوند. عملگر – می تواند برای حذف یک delegate مولفه از یک delegate ترکیب شده استفلاده شود.
با استفاده از این ویژگی Delegate ها شما می توانید یک لیست فراخوانی از متدهایی که در زمانی که delegate فراخوانی می شوند را ایجاد کنید. به این multicasting یک delegate گفته می شود. برنامه زیر multicasting یک delegate را نشان می دهد.
زمانی که کد بالا کامپایل و اجرا می شود خروجی زیر تولید می شود:
Value of Num: 75
کاربرد Delegate
مثال زیر استفاده delegate را نشان می دهد. Delegate printString می تواند برای ارجاع متدی که یک رشته ورودی می گیرد و چیزی بر نمی گرداند استفاده شود.
ما از این delegate برای فراخوانی دو متد استفاده می کنیم، اولی رشته را در console چاپ می کند و دومی آن را در یک فایل چاپ می کند:
خروجی کد فوق:
The String is: Hello World