extension method در سی شارپ
آیا با متدهای توسعه (Extension Methods) در سیشارپ آشنایی دارید؟
اگر میخواهید متدهای توسعه را یاد بگیرید، حتماً این ویدیو را ببینید.
گاهی اوقات میخواهیم قابلیت جدیدی به یک کلاس اضافه کنیم اما نمیتوانیم کد منبع (source code) آن کلاس را ویرایش کنیم. ممکن است کد منبع کلاس در دسترس نباشد، اجازهای برای اضافه کردن چیزی به آن کلاس نداشته باشیم، یا شاید نمیخواهیم کد کلاس را به دلیل اضافه کردن متدهای جدید کثیف کنیم.
در این مواقع، در سیشارپ میتوانیم از متدهای توسعه استفاده کنیم. با استفاده از قابلیت متدهای توسعه، میتوانیم قابلیتهایی به کلاسهایی که از قبل نوشته شدهاند اضافه کنیم.در حال حاضر، در خود داتنت تعداد زیادی متد توسعه وجود دارد که بر روی کلاسهای مختلف توسط تیم داتنت نوشته شدهاند و ما میتوانیم از آنها استفاده کنیم.
این آموزش بخشی از آموزش پیشرفته دوره ستارگان سی شارپ است.برای یادگیری سی شارپ به صورت پیشرفته می توانید در این دوره شرکت نمایید.
چطور متدهای توسعه یا متدهای اکستنشن را ایجاد کنیم؟
فرض کنید میخواهیم برای نوع (type) int
یک متد توسعه ایجاد کنیم که بتوانیم آن را روی کنسول پرینت کنیم. مثلاً یک متغیر از نوع int
داریم برابر با عدد 100 و میخواهیم با استفاده از نقطه (.) متد Print
را فراخوانی کنیم تا مقدار این متغیر را روی کنسول چاپ کنیم. اما من کد منبع این کلاس را در دسترس ندارم تا بتوانم آن را ویرایش کنم، بنابراین میتوانم یک متد توسعه ایجاد کنم و قابلیت مورد نظرم را به آن اضافه کنم.
برای اضافه کردن متدهای توسعه، باید یک کلاس استاتیک با اصلاحکننده (modifier) استاتیک ایجاد کنیم. ابتدا یک کلاس استاتیک ایجاد میکنیم. سپس یک نام برای کلاس انتخاب میکنیم که میتواند هر نامی باشد و سپس متد توسعه یا همان متد اکستنشن را با ساختاری که دارد پیادهسازی میکنیم. مثلاً من میخواهم برای int
یک متد توسعه تعریف کنم، پس به این صورت میآیم و یک متد عمومی (public) با اصلاحکننده استاتیک تعریف میکنم. خروجی متد مهم نیست، در اینجا برای شما قرار میدهم که میتوانید خروجی را نیز داشته باشید که میتواند هر نوعی باشد. خب، نام آن متد را Print
مینویسیم و باید ورودی آن متد، متغیری از آن نوع (در اینجا int
) را دریافت کند، و اینجا مثلاً میگویم number
. خب، ببینید اینجا که میخواهم از آن استفاده کنم، مثلاً مینویسم i.Print
و متد Print
برای من اضافه میشود و میتوانم از آن استفاده کنم. میخواهم مقدار i
را بگیرم و از ورودی چیزی به آن پاس ندم. پس میتوانم از کلمه کلیدی this
استفاده کنم که همان مقدار را به متد میدهد و اکنون متد توسعه من آماده است و میتوانم در برنامهام از آن استفاده کنم و کاری که میخواهم را درون آن متد بنویسم. مثلاً اینجا میخواهم مقدار این متغیر را روی کنسول نمایش دهم و روی کنسول به این صورت نمایش داده میشود. و حالا میرویم به بخش کلاینت، جایی که i
را مینویسم، میبینید با زدن نقطه متد Print
اضافه میشود و میتوانم از آن استفاده کنم. خب، ببینید زمانی که از یک کلاس و یک نوع استفاده میکنیم، میتوانیم متدها و پراپرتیهای آن را ببینیم و برای نمایش متدها از این آیکون استفاده میشود.
اما ببینید اینجا یک آیکون دیگر وجود دارد که همان آیکون متد یک مکعبه با یک فلش به پایین است که معنای متد توسعه را میدهد. اگر روی متد کلیک کنم، فقط متدهای خود آن نوع را میبینم و اگر این را بردارم و روی متد توسعه کلیک کنم، فقط متدهای توسعه را نمایش میدهد. اکنون این یک متد توسعه است که توسط خودم برای نوع int
ایجاد شده و اگر آن را صدا بزنم، مقدار i
را به متد Print
میفرستد و آن را روی صفحه چاپ میکند تا خروجی را با هم ببینیم. برنامه اجرا شد و مقدار متغیر را به آن متد فرستاد و روی کنسول نمایش داد. ما برای هر نوعی میتوانیم متد توسعه ایجاد کنیم و ساختار آن به این صورت است که متد عمومی (public) و استاتیک باشد، نوع خروجی مورد نیاز شما (مثلاً string
یا هر نوعی)، سپس نام متد و بعد از آن با استفاده از کلمه کلیدی this
مقدار ورودی از هر نوعی را دریافت میکنید. مثلاً ما میخواهیم برای کلاس Program
بنویسیم. اینجا میگوییم Program
یا هر کلاس دیگری میخواهیم برای string
بنویسیم. اینجا مینویسیم string
و سپس string
را دریافت میکنیم و یک عملیات روی آن انجام میدهیم و خروجی را برمیگردانیم. مثلاً میگوییم به علاوه هر چیزی که بود این را به آن اضافه کن. میتوانیم متد توسعه خود را بنویسیم و عملیات خود را اینجا انجام دهیم و در کلاینت متغیرهایی که از آن نوع هستند، اکنون میتوانند کلاس هم باشند. فقط این دو متد توسعه را. حال، ما نه تنها برای نوعهای متغیر، بلکه برای کلاسها هم میتوانیم متد توسعه ایجاد کنیم و به این صورت میتوانیم از متد توسعه خود هم استفاده کنیم. ببینید، اینجا الان روی متد توسعه کلیک میکنم. اینجا متدهای توسعه کلاس string
را نمایش میدهد که دو تا از قبل برای string
نوشته شدهاند و این هم متد توسعهای که من نوشتم و میتوانم از آن استفاده کنم. پس اگر بخواهیم قابلیتی به یک کلاس اضافه کنیم، میتوانیم از متدهای توسعه برای این کار استفاده کنیم.