Extension method درسی شارپ، راهی برای کارایی بالا در کدها

Extension method درسی شارپ، راهی برای کارایی بالا در کدها
تاریخ بروزرسانی : 25 اردیبهشت 1399 | تعداد بازدید : 7312 | زمان خواندن مقاله : 10
سی شارپ،
شما قبلا با مفاهیم اولیه و تا حدودی با مباحث اصلی و آموزش سی شارپ مقدماتی آشنایی دارید. حالا که به یک برنامه نویس حرفه ای تبدیل شده اید، وقت آن است که با هم درباره Extension methodها صحبت کنیم و بدانیم Extension method چیست؟
چه کاربردی دارد؟
چگونه میتوان از آنها استفاده کرد؟
آیا میتوان یک Extension method متد ساخت؟ چگونه؟

قبل از تعریف، دانستن این نکته حائز اهمیت است که حتما باید از قبل، آشنایی با کلاس ها و اعضای static را برای یادگیری Extension method ها فراگرفته باشید. با توجه به این نکته موقعیتی را در نظر بگیرید که می خواهید به یک کلاس متدی اضافه کنید. اما یا کد کلاس در اختیار شما نیست و یا نمی خواهید کد اصلی کلاس دستکاری شود. برای اینکار از Extension Method ها استفاده می شود.

تعریف Extension method:

متدهایی هستند که متعلق به هیچگونه کلاسی نیستند و ازطریق کلاس های دیگر اضافه میشوند. در واقع متدهای Extension همانطور که از نامشان پیداست متد های اضافی هستند. میتوان متدهای Extension را به اینترفیس ها، ساختارها و کلاس ها در سی شارپ، اضافه کرد. این کار بدون تغییر و ویرایش ساختارها، کلاس ها و اینترفیس ها انجام می شود. متدهای Extension می توانند به کلاس های تعریف شده توسط برنامه نویس و یا کلاس های تعریف شده در دات نت فریمورک اضافه شوند.

ساختار نوشتاری Extension method:

ابتدا باید یک کلاس static برای Extension Method ها تعریف کنیم. به ازای هر Extension Method، متدی با ساختار زیر داخل کلاس static تعریف شده ایجاد می کنیم:
public static {return-type}  {name} (this {data type}  {instance name}, {parameters})
{
}

آموزش سی شارپ

  • return-type: نوع داده بازگشتی متد را مشخص می کند.
  • name: نام متدی که قرار است به شئ مورد نظر از یک کلاس اضافه شود. این نام کاملاً دلخواه است.
  • this: نوع شی که قراراست به تابع رجوع کند. 
  • data type: نوع داده ای که تصمیم داریم به شئ های آن یک متد اضافه کنیم.
  • instance name: نام متغیری که به واسطه آن می خواهیم به شئ ای که متد بر روی آن ایجاد می شود دسترسی داشته باشیم را مشخص می کند.این نام کاملاً دلخواه است.
  • parameters: لیست پارامترهای ورودی متدی که قصد تعریف آن را داریم مشخص می کند.
فرض کنید، میخواهیم به نوع داده int یک متد اضافه کنیم که یک عدد را به عنوان ورودی گرفته و عدد داخل متغیر ایجاد شده را به توان ورودی رسانده و برگرداند. برای این کار کافیست ابتدا کلاسی برای Extension Method ها اضافه کنیم: 
 
public static class IntExtensions
{
         
}

بهتر است برای Extension Method های هر نوع داده، یک کلاس جداگانه ایجاد کنیم مانند LongExtensions یا CustomExtensions. بخش اول، اشاره به کلاسی می کند که ما تصمیم داریم برای آن Extension Method ایجاد کنیم. در ادامه متدی با نام Pow به نوع داده Int اضافه می کنیم:

public static class IntExtensions
{
public static int Pow(this int number, int pow)
{
int result = 1;
for (int counter = 0; counter < pow; counter++)
result = result*number;
return result;
}
}

حال برای استفاده از این متد کافیست آن را برای متغیرهایی از نوع int در متد اصلی برنامه یعنی متد main() به صورت زیر فراخوانی کنیم:

int myNum = 4;
var pow = myNum.Pow(3);
Console.WriteLine(pow);

اگر به قسمت تعریف Extension Method بر گردیم، پارامتری با نام number داخل متد Pow میبینیم. در حقیقت این متد به مقدار داخل متغیری اشاره می کند که ما Extension Method را بر روی آن اجرا می کنیم. در کد بالا، پارامتر number به مقدار 4 که داخل متغیر myNum ریخته شده اشاره می کند. 

شما برای هر نوع داده و هر کلاسی می توانید Extension متد تعریف کنید. زمانی که Intellisense باز می شود، متد های عادی به صورت یک مکعب نمایش داده می شوند، اما Extension Method ها به صورت یک مکعب که یک فلش آبی رنگ به سمت پایین، در بالای آن قرار دارد نمایش داده می شوند. 

 

تبدیل متد price() به ریال:

برای تبدیل متدprice() در سی شارپ به ریال به روش زیر عمل میکنیم. ابتدا کلاسی برای Extension Method تعریف میکنیم و کد زیر را مینویسیم:
public static string ToRial(this int Value)
{
return Value.ToString("#,0 Rial");
}

بعد از تعریف قطعه کد بالا در کلاس Extension Method به متد اصلی یعنی متد ()main رفته و مینوسیم:

public class Program
{
static void Main(string[] args)
{
int Price = 25000;
Console.WriteLine(Price.ToString("#,0 Rial"));
Console.WriteLine(Price.ToRial());
Console.WriteLine(147852369.ToRial());
}
}

اکنون از این کد میتوانید برای تبدیل کردن price به صورت ریال در برنامه استفاده کنید.

نکاتی برای تعریف Extension Method:

  • اول اینکه متد ها را در یک کلاس استاتیک بنویسید.

  • دوم برای اینکه به کامپایلر بگوییم که این تابع، یک تابع توسعه هست باید در اولین پارامتر ورودی از کلمه ی کلیدی this استفاده کنید.

  • سوم اینکه اگر یک تابع توسعه تعریف کردیم ولی یک توسعه داخلی با الگوی مشابه وجود داشته باشد، اولویت با توسعه داخلی میباشد.

  • و نکته دیگر رویدادها و عملگرها قابل توسعه نیستند !

 

 


کلمات کلیدی :
سی شارپ