متدهای بینام
تا اینجا، شما دیده اید که میتوانید از متدهای نمونه یا متدهای استاتیک برای نمونه سازی delegate استفاده کنید. در هرصورت، متد بخودی خود میتواند از قسمت های دیگر کد بصورت صریح فراخوانی شود و البته باید عضوی از یک کلاس یا ساختار باشد.
اگر متد تنها برای نمونه سازی delegate استفاده شده باشد چطور؟ در چنین شرایطی، بجز اینکه به نیازمندی های نحوی و املائی برای ساختن delegate احتیاج داریم، در واقع نیازی به ساختن یک متد با نام جداگانه وجود ندارد. متدهای بی نام به شما اجازه میدهند که از ساختن متدهای نامدار بیهوده جلوگیری کنید.
- یک متد بی نام، متدی است که در محل نمونه سازی delegate ، اعلان میشود.
برای نمونه، شکل زیر دو نسخه از یک کلاس یکسان را نشان میدهد. نسخه سمت چپ یک متد به نام Add20 را اعلان و استفاده میکند. نسخه سمت راست بجای آن از متد بی نام استفاده میکند. قسمت هایی از کد که سایه گذاری نشده، کاملا برابر هستند.
مجموعه کدهای بالا هر دو نتیجه زیر را در بر خواهند داشت:
25
26
طرز استفاده از متدهای بی نام
شما میتوانید از متدهای بی نام در جاهای زیر استفاده نمائید:
- بعنوان عبارت مقداردهی اولیه کننده (initializer expression) در هنگام اعلان متغیر وکالتی.
- در سمت راست یک بیان انتساب (جمله ای که در آن عملگر = وجود داشته باشد) در هنگام ترکیب delegate ها.
- در سمت راست یک بیان انتساب که یک delegate را به یک event انتساب میدهد.
املاء (syntax) متدهای بی نام
املاء یک متد بی نام شامل اجزاء زیر میباشد:
- کلمه کلیدی delegate
- لیست پارامترها، که میتوان آن را ننوشت -البته درصورتی که بلوک بیان (statement block) شامل هیچ پارامتری نباشد.
- بلوک بیان که حاوی کد مربوط به متد بی نام میباشد.
نوع برگشتی
یک متد بی نام بصورت صریح نوع برگشتی را اعلان نمیکند. هرچند رفتار پیاده سازی کد متد بخودی خود باید با نوع برگشتی delegate همخوانی داشته باشد؛ با برگرداندن یک مقدار از همان نوع. اگر یک delegate دارای یک نوع برگشتی void باشد، متد بینام نمیتواند مقداری را برگشت دهد.
برای مثال، در کد زیر، نوع برگشتی delegate از نوع int است. بنابراین کد قسمت پیاده سازی متد بینام باید در هرشرایطی یک int را برگشت دهد.
delegate int OtherDel(int InParam);
static void Main()
{
OtherDel del = delegate(int x)
{
return x + 20 ; // Returns an int
};
...
}
پارامترها
بجز در مورد پارامترهای آرایه ای، لیست پارامتر یک متد بینام باید با همتای خود در delegate همخوانی داشته و از تابع 3 ویژگی زیر باشد:
- تعداد پارامترها
- نوع و محل قرارگیری پارامترها
- اصلاحگرها (modifiers)
شما میتوانید با خالی رها کردن پرانتزهای لیست پارامتر متد بینام، لیست پارامتر را ساده کنید، اما فقط درصورتی که هر دو شرط زیر برقرار باشد:
- لیست پارامتر delegate شامل هیچ پارامتر out ی نشود.
- متد بینام از هیچ پارامتری استفاده نکند.
برای مثال، کد زیر یک delegate را که هیچ پارامتر out ی ندارد و یک متد بینام که از هیچ پارامتری استفاده نمیکند، اعلان میکند. بنابراین هر دو شرط برقرار است و شما میتوانید از لیست پارامتر متد بی نام صرف نظر کنید.
delegate void SomeDel ( int X ); // Declare the delegate type.
SomeDel SDel = delegate // Parameter list omitted
{
PrintMessage();
Cleanup();
};
پارامترهای params
اگر delegate لیست پارامتری شامل پارامتر params را اعلان کند، آنگاه کلمه کلیدی params از لیست پارامترهای متد بینام صرف نظر می شود. برای مثال، در کد زیر:
- اعلان نوع وکالتی ، آخرین پارامترش را بصورت params تعیین کرده.
- هرچند لیست پارامتر متد بینام، باید از کلمه کلیدی params صرف نظر کند.