متدهای توسعه‌یافته

متدهای توسعه‌یافته (به انگلیسی: Extension Methods) نوع خاصی متد static هستند که با هدف اضافه کردن یک متد به کلاس یا کلی‌تر نوع داده «که از قبل وجود دارد»، بدون دسترسی مستقیم به آن استفاده می‌شوند. برای استفاده از این قابلیت دانستن نکات زیر ضروری است:

  • طبق قرارداد سی شارپ این متد باید در یک کلاس static تعریف شود؛ چرا که اولاً متد توسعه‌یافته عملاً ربطی به کلاسی که در آن تعریف می‌شود ندارد و آن کلاس تنها حکم مکانی برای نوشتن متد را دارد و ثانیاً اگر این کلاس static نبود امکان نمونه‌سازی از آن و دسترسی به متد توسعه‌یافته به صورت بی‌ربط به کلاس (و کاربرد) اصلی خودش وجود داشت. همچنین نباید امکان دسترسی به کلاس حذف شود (از آنجایی که access modifier پیشفرض کلاس‌ها internal است یعنی همین که آن به private تغییر داده نشود امکان دسترسی به کلاس وجود دارد).

  • این متد حتماً باید با سطح دسترسی public نوشته شود. چرا که در هر صورت از این متد در جایی خارج از کلاس فعلی آن استفاده خواهد شد (چون اگر داخل کلاسی هم‌جنس خودش قرار داشت دیگر نیازی نبود آن را به صورت توسعه‌یافته تعریف کنیم).

  • این متد باید به صورت static تعریف شود. به دلیل آن که نیازی به نمونه‌سازی از کلاسی که متد در آن تعریف شده است نباشد. ضمن این که اصلاً امکان نمونه‌سازی از یک کلاس static وجود ندارد.

  • امکان اضافه کردن متدهای توسعه‌یافته به کلاس‌های استاتیک از پیش تعریف شده (برای مثال Console) وجود ندارد. چون رسالت متدهای توسعه‌یافته افزودن قابلیت به اشیاء و نمونه‌ها است.

  • به هیچ وجه امکان override کردن متدهای اصلی با استفاده از متدهای توسعه‌یافته وجود نخواهد داشت.

ایجاد متد توسعه‌یافته

برای ایجاد یک متد توسعه‌یافته، کافی است با رعایت نکات بالا و تنها با استفاده از کلمه‌ی کلیدی this در اولین (و فقط اولین) پارامتر ورودی متد، متد را برای کلاس یا نوع داده‌ی اولین پارامتر توسعه‌یافته نمود. توجه داشته باشید که لزومی ندارد خروجی متد توسعه‌یافته حتماً از نوع ورودی آن باشد.

به کد زیر دقت کنید:

static class ExtensionMethods
{
public static string ConcatNumberToString(this string myString, int myInt)
{
return myString + myInt.ToString();
}
}

با استفاده از قطعه کد بالا، به نمونه‌های نوع string، متدی تحت عنوان ConcatNumberToString اضافه می‌شود که یک آرگومان از جنس int به نام myInt دریافت کرده و آن را به رشته الحاق می‌کند (پارامتری که در ابتدای آن کلمه‌ی کلیدی this آمده است در هنگام استفاده از متد نمایش داده نمی‌شود و به نظر می‌رسد که متد تنها یک آرگومان دریافت می‌کند. بنابراین اگر در متدهای توسعه‌یافته تنها از یک پارامتر استفاده شود آن متد در هنگام استفاده ورودی نخواهد داشت).

استفاده از متدهای توسعه‌یافته

در نهایت با قطعه کد زیر از متد توسعه‌یافته استفاده می‌شود:

//Main Method:
string myName = "Ashkan";
myName = myName.ConcatNumberToString(123); //Output: "Ashkan123"