متدهای بینام
تا اینجا، شما دیده اید که میتوانید از متدهای نمونه یا متدهای استاتیک برای نمونه سازی delegate استفاده کنید. در هرصورت، متد بخودی خود میتواند از قسمت های دیگر کد بصورت صریح فراخوانی شود و البته باید عضوی از یک کلاس یا ساختار باشد.
اگر متد تنها برای نمونه سازی delegate استفاده شده باشد چطور؟ در چنین شرایطی، بجز اینکه به نیازمندی های نحوی و املائی برای ساختن delegate احتیاج داریم، در واقع نیازی به ساختن یک متد با نام جداگانه وجود ندارد. متدهای بی نام به شما اجازه میدهند که از ساختن متدهای نامدار بیهوده جلوگیری کنید.
برای نمونه، شکل زیر دو نسخه از یک کلاس یکسان را نشان میدهد. نسخه سمت چپ یک متد به نام Add20 را اعلان و استفاده میکند. نسخه سمت راست بجای آن از متد بی نام استفاده میکند. قسمت هایی از کد که سایه گذاری نشده، کاملا برابر هستند.
پ.ن: البته ما به این کار، راه حل نمیگیم. این تنها پاک کردن صورت مسأله هست. هدف از این مطلب هم تلنگری به بعضی افراد بود.
احضار delegate هایی که دارای مقدار برگشتی هستند
اگر یک وکیل دارای مقدار بازگشتی باشد و در لیست احضارش بیش از یک متد موجود باشد، موارد زیر رخ خواهد داد:
برای مثال کد زیر یک delegate اعلان میکند که دارای مقدار برگشتی از نوع int است. تابع Main یک شیئ از آن delegate ساخته، سپس 2 متد به آن اضافه میکند، بعد از آن delegate را در بیان WriteLine فراخوانی کرده و مقدار برگشتی آن را چاپ میکند. شکل زیر یک ارائه گرافیکی از کد را نشان میدهد.
حذف متدها از delegate
شما همچنین می توانید یک متد را با استفاده از عملگر =- از delegate حذف کنید. تکه کد زیر طرز استفاده از این عملگر را نشان می دهد. شکل زیر نتیجه اجرای کد را نشان می دهد.
delVar -= SCl.m3; // Remove the method from the delegate.
پس از حذف متد از delegate شکل بصورت زیر در می آید.
آره دیگه داداشم! آره! اینجوریاس...
یعنی جدی ما برنامه نویس ها چه برنامه مون درست کار کنه و چه درست کار نکنه علتش رو نمیدونیم. اگه کار نکنه که مشخصه؛ ولی اگه کار کنه هم شانسی بوده :)
انتساب delegate ها
به این دلیل که delegate ها نوع های مرجع هستند، شما می توانید ارجاع گنجانده شده در یک متغیر وکالتی را با انتساب یک ارجاع به آن متغیر وکالتی تغییر دهید. شیئ وکالتی قدیمی توسط زباله روب (Garbage Collector) عزل خواهد شد.
برای مثال، کد زیر مقدار delVar را تنظیم کرده سپس آنرا تغییر می دهد. شکل زیر این موضوع را نشان می دهد.
MyDel delVar;
delVar = myInstObj.MyM1; // Create and assign the delegate object.
...
delVar = SClass.OtherM2; // Create and assign the new delegate object.
اعلان نوع وکالتی (delegate)
همونطوری که در ابتدای بخش قبل گفتم، delegate ها "نوع" هستند، درست مثل کلاس ها که نوع هستند. و مشابه کلاس ها باید قبل از اینکه بتوانید از delegate ها استفاده کنید متغیرها و اشیاء از همان نوع را بسازید. مثال زیر طرز اعلان نوع وکالتی را نشان می دهد:
delegate void MyDel(int x);
اعلان یک نوع وکالتی شباهت بسیار زیادی به اعلان یک متد دارد به این دلیل که در داخل نوع وکالتی هم امضا و نوع برگشتی وجود دارد. این امضا و نوع برگشتی قالب متدهایی که وکیل قبول می کند را مشخص می کند.
در مثال قبل مشخص شده که شیئ وکالتی از نوع MyDel فقط متدهایی که دارای تنها یک پارامتر از نوع int بوده و نوع برگشتی ندارند را قبول می کند. شکل زیر در سمت چپ نوع وکالتی، و در سمت راست شیئ وکالتی را نشان می دهد.
اعلان نوع وکالتی با اعلان متد، از دو جهت تفاوت دارد. اعلان نوع وکالتی
نکته
هرچند اعلان نوع وکالتی شبیه اعلان متد است، نیازی نیست که آنرا در داخل یک کلاس اعلان کنید، زیرا خودش "نوع" است.
اگر غذاهاتون رو توی یخچال نگه میدارید
و لباس هاتون رو توی جالباسی؛
اگه رختخوابی برای خوابیدن دارید
وسقفی بالای سرتونه؛
ثروتمندتر از 75% جمعیت جهان هستید.
قدر داشته هایتان رو بدونید!