متدهای Extension
نام دوره: زبان سی شارپ مقدماتی
نویسنده: علی مقدم جاه (مدرس دوره)
متدهای Extension چیست؟
در پست آموزش متد چیست، با انواع متدها و ساختار آنان آشنا شدید.
همانطور که میدانید، متدها درون بلاک کلاس نوشته میشوند، به عنوان مثال ما متد Sum را در کلاس Test تعریف میکنیم:
class Test
{
public int Sum(int a, int b)
{
return a + b;
}
}
پس در مثال بالا، متد Sum با ۲ ورودی از نوع int، درون کلاس Test نوشته شده است.
درنتیجه هر زمان که بخواهیم از متد Sum استفاده کنیم، از آنجایی که از نوع static تعریف نشده، پس باید ابتدا در برنامه خود یک شئ یا نمونه از کلاس Test تعریف کرده و سپس توسط شناسه آن شئ، متد Sum را فراخوانی کنیم:
class Program
{
public static void Main(string[] args)
{
Test object1 = new Test();
object1.Sum(4,5);
}
}
پس نتیجه میگیریم که متدها درون کلاسها نوشته شده، و حتما برای استفاده از آن متدها بایستی از شناسه شئ آن کلاس استفاده نمود. (البته اگر بصورت static تعریف شوند، میتوان به وسیله نام کلاس به آن دسترسی پیدا کرد)
همانطور که میدانید، به طور کلی دو دسته کلاس وجود دارند:
- دسته اول، کلاسهایی که توسط شما نوشته نشدهاند، همانند کلاس Console که در بسته Net. وجود دارد.
- دسته دوم، کلاسهایی که توسط شما در برنامههای خودتان نوشته خواهند شد.
بعضی اوغات ممکن است شما بنا به هر دلیلی، دسترسی به محتوای کلاسی را نداشته باشید، اما نیاز داشته باشید که یک متد به آن کلاس اضافه کنید! دراینصورت میتوانید از متدهای Extension استفاده کنید.
متدهای Extension این قابلیت را برای شما فراهم میکنند تا به کلاس مورد نظر خود، متدهایی که نوشتهاید را اضافه کنید!
برای نوشتن یک متد Extension، در ابتدا نیاز داریم تا کلاس خود را بصورت static تعریف کنیم:
static class Test
{
}
برای اینکار کافی است تا قبل از کلمه کلیدی class، کلمه static را بنویسیم.
سپس متد مورد نظر خود را در این کلاس، بصورت static تعریف میکنیم:
static class Test
{
public static int Sum(int a)
{
return a + 10;
}
}
برای اینکار کافی است تا پس از کلمه سطح دسترسی متد یعنی public، کلمه کلدی static را بنویسیم.
حالا برای اینکه متد خود را از نوع Extension تعریف کنیم، کافی است تا کلمه this را در ابتدای تمامی متغیرهای ورودی متد اضافه کنیم:
static class Test
{
public static int Sum(this int a)
{
return a + 10;
}
}
متد Extension ما با ساختار فوق آماده شده و میتوانیم در برنامه خود از آن استفاده کنیم.
توجه کنید که چون در ورودی متد Sum، از کلاس int استفاده شده و کلمه this در قبل از آن به کار برده شده است، درنتیجه از الان متد Sum نیز به متدهای کلاس int اضافه شده است.
اما تفاوت فراخوانی متدهای Extension با غیر Extension در چیست؟
متدهای معمولی را در برنامه خود اگر بصورت static باشند توسط نام کلاس، و اگر بصورت static نباشند، توسط شناسه شئ تعریف شده از کلاس فراخوانی و از آن استفاده میکنیم. برای استفاده از آن هم، ورودی را درون پرانتز متد برای آن ارسال میکنیم.
اما متدهای Extension، توسط ورودی فراخوانی میشوند!
یعنی به جای اینکه فراخوانی متد توسط نام کلاس، یا نام شئ از کلاس صورت بگیرد، توسط ورودیای است که ما باید در داخل پرانتز برای آن در گذشته مشخص میکردیم:
class Program
{
public static void Main(string[] args)
{
int number = 10;
number.Sum();
}
}
همانطور که در مثال بالامشاهده میکنید، ابتدا یک ظرف از نوع int به نام numnber تعریف کردهایم.
اگر متد Sum بصورت غیر Extension تعریف شده بود، آنگاه باید به شکل زیر از آن استفاده میشد:
class Program
{
public static void Main(string[] args)
{
Test object1 = new Test();
int number = 10;
object1.Sum(number);
}
}
اما چون بصورت Extension تعریف شده، نیازی به تعریف شئ از کلاس Test و ارسال مقدار number به عنوان ورودی، داخل پرانتز متد Sum نیست!
به جای آن کافی است تا ورودی متد را که متغیر number است نوشته، و سپس با درج یک دات(نقطه)، متد Sum را فراخوانی کنیم:
class Program
{
public static void Main(string[] args)
{
int number = 8;
number.Sum();
}
}
بدین شکل ورودی متد Sum، همان شئ number فراخوانی کننده بوده که درنتیجه چون داخل number مقدار ۸ به عنوان داده قرار دارد، پس این مقدار ۸ را به عنوان ورودی به متد Sum ارسال میکند، و چون متد Sum ورودی خود را با عدد ۱۰ جمع میکند، درنتیجه حاصل جمع آن که عدد ۱۸ است که به محل فراخوانی متد Sum که همان دستور ()number.Sum است، بازگردانده میشود.
حال ممکن است سوال برایتان بوجود آمده باشد که آیا ورودیهای یک متد Extension، حتما باید بصورت this تعریف شوند؟
پاسخ این سوال خیر است!
شما میتوانید طبق نیاز خود هر کدام از ورودیها را با کلمه this تعریف کرده، و هرکدام را که نیازی ندارید، بصورت ساده تعریف کنید:
static class Test
{
public static int Sum(this int a, int b)
{
return a + b;
}
}
همانطور که در مثال بالا مشاهده میکنید، متغیر a به عنوان ورودی با کلمه this و متغیر b بدون کلمه this تعریف شده است، در اینصورت زمان فراخوانی به شکل زیر استفاده خواهد شد:
class Program
{
public static void Main(string[] args)
{
int number = 8;
number.Sum(5);
}
}
در مثال فوق، متغیر number با مقدار ۸ به عنوان ورودی متد Sum برای this int a ارسال شده و مقدار ۵ به عنوان ورودی برای متغیر int b ارسال میگردد که نتیجه آن برابر ۸ + ۵ بوده که عدد ۱۳ به محل فراخوانی متد Sum بازگردانی میشود.
جهت شرکت در دورههای زبان برنامه نویسی سیشارپ، از کد تخفیف heplc30 استفاده کنید.