درک و استفاده از متدهای Entension

جمعه 3 خرداد 1392

درک و استفاده از متدهای Entension <br/> متدهای Extension در C# 3.0 به وجود آمد. آنها به شما اجازه می دهند تا متدتان را به type جاری اضافه کنید.

متدهای Extension در C# 3.0 به وجود آمد. آنها به شما اجازه می دهند تا متدتان را به type جاری اضافه کنید،

بدون آنکه از  type جاری هیچگونه ارث بری انجام دهید.

 

سر فصل ها

            1 معرفی

            2 یک مثال ساده

            3 بدون State Managment

            4 مثالی دیگر

            5 نتیجه گیری

           

معرفی

 یک متد extension، یک متد static از نوع خاص می باشد که گفته می شود این یک عضو از type جاری است.

رفتارهای شان کاملا مشابه متدهای معمولی است و حتی بصورت Intellisense برای type مورد نظر هم نشان داده می شوند.

 در واقع، LINQ از extension متد استفاده می کند و این قابلیت را به queryای که از data type جاری IEnumerable و IEnumerable<T> میگیرد، اضافه میکند.

این متدهای LINQ قابلت اجرا برای هر objectای که این typeها را اجرا کرده باشد دارد، حتی اگر آن typeها مانند type اصلی نبوده باشد.

 ساختن یک متد extension بسیار ساده است. بیشترین استفاده این متد برای افزودن سریع متدها به type جاری است.

برای مثال، یک نرم افزار که کاربرد روزانه دارد و با type رشته ای (string) کار می کند و شما هم اکثر اوقات از آن استفاده میکنید.

با کمک متد extension شما می توانید آن را به صورت یک متد در یک کلاس رشته ای ( string class) بنویسید.

 

یک مثال ساده

بیایید با یک مثال ساده آغاز به کار کنیم. یک کلاس رشته ای (string class) همیشه کاربردی است، اما متدی برای معکوس کردن (Reverse())  انواع رشته ای وجود ندارد.

کدی که در ادامه آمده است یک extension متد است که این قابلیت (معکوس کردن حروف از نوع رشته ای) را به کلاس های رشته ای (string class) میدهد.

چند نکته در کد بالا وجود دارد، یکی اینکه کلاس و متد هر دو از نوع static  می باشند.

همچنین، برای توجه به اولین آرگومان Revers() باید از کلید واژه thisاستفاده کرد.

در این شرایط، این کلیدواژه به ما نشان میدهد که متد ما از نوع extension متد  است یااز کلاس رشته ای(string class).

شما می توانید آرگومان های دیگری را اضافه کنید ولی اولین آرگومانی که شناسایی میشود از extension متد با یک type خاص می باشد.

مادامی که کلاس بالا برای کد شما قابل مشاهده باشد، شما می توانید متد Reverse() را برای یک کلاس رشته ای (string class) فراخوانی کنید.

 

زمانی که در C# شما یک مقدار ثابت دارید، شما می توانید  به این صورت از متد استفاده کنید.

 

یک نکته اینکه متدهای extension همیشه در دسترس همه typeهایی که از type اصلی می آیند قرار میگیرند.

شما حتی  میتوانید یک متد extension را به یک object type اضافه کنید.

تا زمانی که همه کلاس ها از آن object مشتق گردند، متد شما به همه کلاس ها دسترسی دارد.

البته، این 100% ایده خوبی نیست.

           

بدون State Managment

           

در اینجا برای متدهای extension دو محدودیت وجود دارد. برای مثال، آنها نمی توانند نمونه متغیرها (instance variables) را برای مدیریت اطلاعات در خود نگهدارند.

به عنوان مثال متد extension زیر، بخشی از token string را تجزیه(parses) میکند.

اگر این متدها بخشی از یک کلاس معمولی بود، ممکن است شما بخواهید یک قابلیت را اضافه کنید برای کلاسی که دنبال موقعیت فعلی  string در حال تجزیه است.

در نتیجه، کد فراخوانی نیازی به دنبال کردن این اطلاعات ندارد.

در کل این یک ویژگی اساسی برنامه نویسی OOP  می باشد.

 

 

            

به هرحال، این مورد از extension متدها، آن قابلیت را برای ما نداریم.

جایی برای ذخیره اطلاعات ما وجود ندارد که مثل این موقعیت کنونی در حال تجزیه باشد.

در عوض، کد فراخوانی شده میبایست به دنبال کردن کد خود ادامه دهد و هر اطلاعاتی را آماده کند.

این موضوع مسئله خیلی مهمی نیست، اما میتواند تاثیر کمی برروی نتیجه درخواست نوشتن کدی که  یک متد extension فراخوانی میکند داشته باشد.

 

           

کدی که در ادامه آمده است، از extension متد ParseToken()  که در بالا تعریف شده استفاده میکند و همه حرفهای string را تجزیه می کند.

مثالی دیگر

 

بیاید برای لذت بردن بیشتر مثال دیگری را ببینیم. کدی که در ادامه آمده است دو extension متد را به کلاس Dictionary <string , string> اضافه میکند.

extension متدهای Save()  و Load() را  برای ذخیره کردن و خواندن محتویات فایل مربوط به دیکشنری اضافه میکنیم.

 

محتویات در یک فایل که برای کاربران قابل خواندن باشد ذخیره می شود.

هر مقدار در یک خط جداگانه با استفاده از یک key ، علامت مساوی (=) و در ادامه مقدار (value) درون دیکشنری ذخیره میشود.

 

توجه ، برای سادگی این  extension متد، مجموعه دیکشنری فقط کلید (key) و مقدار (value) رشته ای (string) میگیرد.

البته شما میتوانید extension متدهایی بسازید که شامل مجموعه ای از دیگر typeها باشد.

امیدوارم این مثال ها برای شما مفید بوده باشد تا بتوانید از extension متدها استفاده کنید.

برای استفاده از این کد، میتوانید یک نمونه از کلاس Dictionary<string, string> بسازید.

و مطمعن باشید که کد فراخوانی شده کلاس بالا "visible"  باشد و متدهای Save() و Load() را با نام  فایل ایجاد کنید.

خلاصه

 

چه چیزی میتواند از نحوه ارتباط یک متد رشته ای (string) که با یک کلاس  رشته ای کار میکند، آسانتر باشد.

 یا داشتن متدی که کلاس مجموعه ها را در مجموعه ذخیره میکند.

پیدا کردن متدهای کمکی خیلی آسانتر است زمانی که آنها به عنوان بخشی از type آنها در عمل به نظر می رسد.

به این دلایل، من فکر میکنم که extension متدها بسیار بهتر اند.To be sure, they can be abused.

اما میتوانند تکنیک های قویتری به متدهای کنونی ما اضافه کنند.

البته شما انتخاب های دیگری هم دارید. می توانید از کلاس جاری ارثبری کنید و متدهای جدید را به آن اضافه کنید.

واین به شما این توانایی را میدهد که بتوانید اطلاعاتتان را چک کنید.

به هر حال extension متدها کمی انعطاف پذیری بیشتری به شما میدهند زیرا اونها امکانات جدید را به کلاس کنونی شما که در حال استفاده میباشید  میدهند.

و اگر شما بخواهید کلاس جدیدی را ایجاد کنید، میبایست کدتان را تغيیر دهید.

در هر صورت، دانستن extension متدها برای شما خوب می باشد، زیرا هر زمان که نیاز داشته باشید می توانید از آنها استفاده کنید.       

 

 

 

سجاد باقرزاده

نویسنده 54 مقاله در برنامه نویسان
  • C#.net
  • 2k بازدید
  • 1 تشکر

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید