یکی از قابلیتهای جدید و جالب توجه سی شارپ 3 متدهای تعمیم یافته (Extension Methods) هستند. یک متد تعمیم یافته به یک متد استاتیک گفته می شود که در یک کلاس از نوع استاتیک وجود دارد و شما می توانید بر خلاف متدهای استاتیک عادی، روی نمونه های کلاس یا همان instance های کلاس، مثل یک متد عادی برای آن نمونه از کلاس استفاده کنید اما قادر نخواهید بود که همان متد را در سطح کلاس استفاده نمایید. برای درک تفاوت متدهای سطح کلاس و متدهای استاتیک عادی به مثال توجه نمایید.
به عنوان مثال متد ToUpper یک متد عادی تعریف شده در سطح کلاس string است که فقط روی نمونه های کلاس میتوان از آن استفاده کرد مثلا:
String name="Ali"; Console.WriteLine(name.ToUpper()); |
بعد از اجرای کد بالا کلمه "ALI" به کاربر نشان داده خواهد شد. حال اگر بخواهیم همین متد را روی کلاس استفاده کنیم یعنی مثلا string.ToUpper() با خطای کامپایلر مواجه خواهیم شد.
بالعکس اگر بخواهیم متدهای استاتیک تعریف شده داخل کلاس را روی نمونه های کلاس استفاده کنیم، با خطا مواجه می شویم. به عنوان مثال متد Format در سطح کلاس string تعریف شده، یعنی اگر بنویسیم : name.Format(…..) با خطای کامپایلر روبرو خواهیم شد در صورتی که نحوه استفاده صحیح از این متد string.Format(…) می باشد.
اما متدهای تعمیم یافته علاوه بر اینکه متد استاتیک هستند، به شما اجازه می دهند که آنها را در روی نمونه های گرفته شده از کلاس استفاده کنید، نه روی خود کلاس.
تعریف و فراخوانی یک متد تعمیم یافته:
به نکات زیر توجه کنید:
1- در تعریف یک متد تعمیم باید دقت کنیم که حتما آنرا داخل یک کلاس استاتیک تعریف نماییم.
2- اولین آرگومان متد تعریف شده باید با کلیدواژه this تعریف گردد.
3- فراموش نکنیم که متد تعمیم یافته باید از نوع استاتیک باشد.
مثال:
namespace csharp.Utilities { public static class StringConversions { public static double ToDouble(this string s){ return Double.Parse(s); } Public static bool ToBool(this string s){ return Boolean.Parse(s); } } }
//حال از متدهای تعریف شده استفاده می کنیم using csharp.Utilities
double pi="3.1415926335".ToDouble(); Console.WriteLine(pi);
|
اگر بخواهیم میان متدهای تعمیم یافته و متدهای عادی اولویت قرار دهیم، متدهای عادی اولویت بیشتر را به خود اختصاص میدهند، به دلیل اینکه متدهای تعمیم یافته دارای محدودیت عملکرد هستند. اما به طور کلی متدهای بسیار مفیدی بوده و خصوصا در جاهایی که نیاز به بسط دادن یک کلاس داریم اما به دلایل مختلفی از قبیل عدم دسترسی به سورس کلاس و یا sealed بودن آن نمی توانیم اینکار را انجام دهیم، بسیار مفید خواهند بود.