صفحه شخصی سید علا سبزپوش

برنامه نویس دات نت و sql_server --ریاضیات

صفحه شخصی سید علا سبزپوش

برنامه نویس دات نت و sql_server --ریاضیات

سطح دسترسی Access Modifiers

ما در زبان سی شارپ بطور کلی دارای چهار سطح دسترسی بصورت زیر هستیم .

1-private  : دسترسی اختصاصی میباشد. در این حالت عضو مورد نظر از بیرون کلاس قابل مشاهده و دسترسی نخواهد بود و فقط در داخل کلاسی که تعریف میشود قابل دسترسی خواهد بود.

2-public  : دسترسی عام میباشد. عضوی که از نوع public است از بیرون کلاسی که در آن تعریف شده است ، توسط دیگر کلاسها کاملا قابل دسترسی و ویرایش خواهد بود.

3-internal  : تنها در داخل فایل یا اسمبلی فعلی قابل استفاده خواهند بود

4-protected  : تنها در کلاسی که تعریف در آن تعریف شده و کلاسهایی که از آن کلاس مشتق میشوند قابل دسترسی خواهد بود.

در شکل زیر بصورت گرافیکی نحوه سطح دسترسی عناصر را نمایش می دهیم  

 

 

                           

 به شکل اول تصویرنگاه کنید همانطور که می بینید دایره سبز رنگ نشان دهنده سطح دسترسی متغیر public  است. می بینیم که این سطح دسترسی هم در خارج از کلاس و هم د ر خارج از پروژه ما قابل دسترسی است .

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

دایره آبی رنگ نشان دهنده سطح دسترسی internal  است . یعنی کلاس یا متغیری از این نوع فقط در سطح همان پروژه قابل دسترسی است و اگر ما فرضا پروژه 2 را ایجاد کنیم و بخواهیم از کلاس با سطح دسترسی internal  در پروژه 2 استفاده کنیم ممکن نیست .

و سرانجام شکلهای نامنتظم قهوه ای رنگ را می بینید که نشان دهنده سطح دسترسی protected  است .

سطح دسترسی دیگری نیز وجود دارد تحت عنوان protected internal  این سطح دسترسی در همان پروژه تعریف شده قابل دسترسی است و علاوه بر آن  اگر کلاسی از پروژه دیگر از آن ارث بری کند نیز قابل دسترسی است .

در واقع برابر با internal +protected  است . از اجتماع این دو در شکل بالا می توانید آن را مشاهده کنید قهوه ای به اضافه رنگ آبی .

 

برای دانلود اصل مطلب بدلیل ضعف ویرایشگر وبلاگ علاقه مندان می توانند  بصورت فایل دانلود کنند

Extension Methods

شاید تاکنون برای شما اتفاق افتاده باشد که می خواهید متدی را به کلاسی اضافه کنید اما با مشکلات زیر مواجه هستید :

 

1-به سورس کلاس دسترسی ندارید ، سورس کلاس در اختیار شما نیست .

2-کلاس شما اجازه ارث بری ندارد   sealed است ، شما نمی توانید کلاس دیگری ایجاد کنید و از آن ارث بری کنید

 

اما شما نیاز مبرم دارید به اینکه به کلاس مورد نظرتون متدی را اضافه کنید ، خوشبختانه از سی شارپ 3 ، متدهای توسعه یافته Extension Methods مشکل فوق را براحتی حل کرده است .

 

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




همانطور که می بینید ما یک کلاس داریم به نام mydata   این کلاس اجازه ارث بری را به هیچ کلاس دیگری نمی دهد اما حالا ما بر حسب ضرورت ما می خواهیم متدی را به آن اضافه کنیم ، برای اینکار حتما باید رویه زیر را انجام دهیم .

 

1-ابتدا یک کلاس استاتیک تعریف می کنیم تاکید می شود که حتما کلاس ما استاتیک باشد مانند کلاس مثال بالا ExtendMyData

 

2-متدی را تعریف می کنیم که این متد ، اولا باید حتما استاتیک باشد و ثانیا حتما اولین پارامتر آن از نوع this  باشد و بعد از کلمه کلیدی this  نام کلاس ذکر شود .

 

اکنون متد ما آماده است هر جا لازم بود می توانیم براحتی با تعریف متغیری از نوع کلاس mydata  براحتی متد بالا را فراخوانی کنیم .

 

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



برگرفته از کتاب Illustrated C# 2008 از انتشارات apress

Lambda Expressions

Lambda Expressionها، خیلی شبیه به Anonymous Methodها (Delegateها) هستند.که در پست قبلی در مورد آن توضیح دادم .در واقع عبارتهای Lambda Expression نوعی مختصرتر و روانتر از نوع Anonymous Method است که در سی شارپ 3 به بعد توسط مایکروسافت ارایه شد .

مهمترین و پرکاربردترین موارد استفاده از این عبارت در linq  است .

    

   Anonymous Method وdelegate

اکنون سعی می کنیم گام به گام از 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

لینکهای مفید :

لینک ۱

لینک۲

لینک۳