شاید تاکنون برای شما اتفاق افتاده باشد که می خواهید متدی را به کلاسی اضافه کنید اما با مشکلات زیر مواجه هستید :
1-به سورس کلاس دسترسی ندارید ، سورس کلاس در اختیار شما نیست .
2-کلاس شما اجازه ارث بری ندارد sealed است ، شما نمی توانید کلاس دیگری ایجاد کنید و از آن ارث بری کنید
اما شما نیاز مبرم دارید به اینکه به کلاس مورد نظرتون متدی را اضافه کنید ، خوشبختانه از سی شارپ 3 ، متدهای توسعه یافته Extension Methods مشکل فوق را براحتی حل کرده است .
اکنون برای بهتر فهمیدن مطلب به شکل زیر دقت کنید
همانطور که می بینید ما یک کلاس داریم به نام mydata این کلاس اجازه ارث بری را به هیچ کلاس دیگری نمی دهد اما حالا ما بر حسب ضرورت ما می خواهیم متدی را به آن اضافه کنیم ، برای اینکار حتما باید رویه زیر را انجام دهیم .
1-ابتدا یک کلاس استاتیک تعریف می کنیم تاکید می شود که حتما کلاس ما استاتیک باشد مانند کلاس مثال بالا ExtendMyData
2-متدی را تعریف می کنیم که این متد ، اولا باید حتما استاتیک باشد و ثانیا حتما اولین پارامتر آن از نوع this باشد و بعد از کلمه کلیدی this نام کلاس ذکر شود .
اکنون متد ما آماده است هر جا لازم بود می توانیم براحتی با تعریف متغیری از نوع کلاس mydata براحتی متد بالا را فراخوانی کنیم .
نکته آخر ، فراموش نکنید که کلاس شما و کلاس متد توسعه یافته باید در یک فضای نام NameSpace باشند مانند تصویر زیر که ساختار را کاملا نشان می دهد .
برگرفته از کتاب Illustrated C# 2008 از انتشارات apress
Lambda Expressionها، خیلی شبیه به Anonymous Methodها (Delegateها) هستند.که در پست قبلی در مورد آن توضیح دادم .در واقع عبارتهای Lambda Expression نوعی مختصرتر و روانتر از نوع Anonymous Method است که در سی شارپ 3 به بعد توسط مایکروسافت ارایه شد .
مهمترین و پرکاربردترین موارد استفاده از این عبارت در linq است .
اکنون سعی می کنیم گام به گام از Anonymous Method به سمت Lambda Expression حرکت کنیم .
برای اینکار فرض کنید یک عبارت delegate داریم ، برای رسیدن به Lambda Expression اقدامات زیر را انجام می دهیم :
ابتدا کلمه delegate را حذف می کنیم .
اپراتور <= را در بین اعلان پارامترها و بدنه تابع قرار می دهیم . این اپراتوار را goes to می نامند . شکل زیر دو عبارت را با هم مقایسه می کند .
در شکل بالا دقت کنید تا متوجه شوید چگونه یک عبارت Anonymous Method براحتی تبدیل به یک عبارت Lambda Expression شده است .
عبارت بالا هنوز کاملا خلاصه نشده است . باز هم می توان آن را خلاصه تر کرد.
برای اینکار به سورس کد زیر دقت کنید
Le1 این عبارت درست است اما ما در اینجا از کمترین امکان خلاصه سازی استفاده کرده ایم ما در اینجا فقط کلمه delegate را حذف کردیم و عبارت <= را اضافه کرده ایم
Le2 ما در عبارتهای Lambda Expression می توانیم اعلان صریح نوع متغیر (پارامتر ورودی ) را حذف کنیم و اعلان نکنیم مثال حالت دوم را ببینید و فقط آن را در میان پرانتز محصور می کنیم .
Le3 در اینجا باز هم فراتر می رویم اینجا علاوه بر حذف اعلان نوع پارامتر ورودی پرانتز را هم می توانیم حذف کنیم
Le4 و سرانجام به خلاصه ترین حالت می رسیم که هم اعلان نوع پارامتر ورودی و هم پرانتز و هم آکولادها و هم کلمه کلیدی return قابل حذف شدن هستند
در واقع ما در عبارتهای Lambda Expression ، پارامترهای خودمان را می توانیم بصورت غیر صریح یعنی بدون مشخص کردن نوع آنها ، اعلام کنیم . و اگر متد ما دارای یک خط باشد دیگر نیازی به آکولاد محصور کننده کد نداریم . اما اگر بیش از یک خط باشد باید کد بدنه بین آکولادها باشد
در زیر فرم کلی عبارتهای Lambda Expression را بصورتی کاملا واضح بیان می کنیم .
بر گرفته از کتاب Illustrated C# 2008
لینکهای مفید :
در پست قبلی در مورد delegate صحبت کردیم ، اگر دقت کنید delegate ابتدا می بایست توسط یک متد با نام اعلان می شد و سپس بر اساس همان متدی با امضای یکسان ، لیستی از متدهای دیگر به آن اضافه می شد .
اما در سی شارپ 2 شما می توانید delegate مورد نظر را در بدنه ی کد خود و بدون نیاز به تعریف متد مجزا اعلان کنید . در واقع اینجا ما با متدهایی سرو کار خواهیم داشت که بی نام هستند . در واقع می توان گفت استفاده از متدهای بی نام ، به نوعی کد نویسی را کاهش می دهد. ما در هر جا که لازم داشتیم می توانیم فورا یک متد بی نام استفاده کنیم .
در عکس بالا مشاهده می کنید که در طرف چپ از همان روش معمولی delegate با متدهای نام دار استفاده می کند اما در سمت چپ ما همان کلاس را می بینیم با این تفاوت که در اینجا از متد بی نام استفاده کردیم و دیگر نیازی به اعلانهای متد و delegate نداریم و از همه مهمتر می بینیم که چقدر کد ما خوانا تر و خلاصه تر شده است .
برای درک بهتر مطلب خواندن لینکهای زیر بسیار مفید هستند .
http://www.codeproject.com/KB/cs/InsideAnonymousMethods.aspx
http://msdn.microsoft.com/en-us/library/0yw3tz5k.aspx