محتویات سایت
        برچسب های محبوب 








 
   آشنايي با متدهای تعميم يافته (Extension Methods)
  بررسی کلی و آشنايی با نحوه نوشتن متدهای تعميم يافته
   C#
   ۲۶۳۹۳
   این مقاله حاوی فایل ضمیمه نمی باشد
   رکسانا زاهدی
   ۱۳۸۷/۸/۱۷
نسخه قابل چاپ نسخه قابل چاپ

یکی از قابلیتهای جدید و جالب توجه سی شارپ 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 بودن آن نمی توانیم اینکار را انجام دهیم، بسیار مفید خواهند بود.