ما اصلاح کننده های دسترسی زیر را در سی شارپ در دسترس داریم .
- عمومی
- خصوصی
- حفاظت شده
- درونی؛ داخلی
- داخلی محافظت شده
نحوه انتخاب اصلاح کننده های دسترسی مناسب در برنامه ما یک مانع بزرگ است. بیایید سعی کنیم راه حل را از طریق چند پیاده سازی کوچک پیدا کنیم.
سطح پیاده سازی/دسترسی انواع اصلاح کننده | در سطح فضای نام | در سطح کلاس در سطح عملکرد |
عمومی | آره | آره |
خصوصی | خیر | آره |
حفاظت شده | خیر | آره |
درونی؛ داخلی | آره | آره |
داخلی محافظت شده | خیر | آره |
من سعی کردم یک نمای جدولی برای ساده سازی ایجاد کنم. اکنون، بیایید سعی کنیم آنچه را که داده های جدول نشان می دهد، بررسی کنیم.
سربرگ ستون جدول نشان می دهد که پیاده سازی کجا می تواند امکان پذیر باشد. به عنوان مثال، در چه سطحی واجد شرایط دسترسی به کدام نوع از اصلاح کننده های دسترسی هستیم.
توجه: در سطح عملکرد همه چیز خصوصی است. ما حتی نمی توانیم به طور صریح به یک عضو داده خصوصی اعلام کنیم.
پیاده سازی در سطح فضای نام
هر عنصری که می تواند در سطح فضای نام تعریف شود باید دارای اصلاح کننده های دسترسی عمومی یا داخلی باشد. همین را ثابت کنیم.
در اینجا سعی شده است یک کلاس از سطح دسترسی به عنوان خصوصی ، رابط با سطح دسترسی به عنوان محافظت شده ، enum با سطح دسترسی به عنوان داخلی محافظت شده و یک ساختار تعریف شود .
در پایین صفحه به وضوح میتوانیم خطای خطا را ببینیم که میگوید: « عناصر تعریفشده در فضای نام نمیتوانند بهصراحت بهعنوان خصوصی، محافظتشده یا محافظتشده داخلی اعلام شوند».
یعنی فقط گزینه عمومی یا داخلی برای ما باقی مانده است. حال چگونه تشخیص دهیم که اصلاح کننده های دسترسی پیش فرض برای عناصر در سطح فضای نام چیست؟ دوستان سوال مصاحبه بسیار جالب و پیچیده ای است. من با این سوال بمباران شده ام، "مدیفایر پیش فرض دسترسی در سی شارپ چیست؟" در بسیاری از مصاحبه هایی که من به عنوان مصاحبه شونده در آنها ظاهر شده ام.
همیشه فکر میکردم «داخلی» است، با این حال، وقتی سعی کردم به تنهایی آن را بفهمم، متوجه شدم تصورم اشتباه است. وقتی این سوال پیش میآید که اصلاحکننده دسترسی پیشفرض در سی شارپ چیست، باید از مصاحبهکننده بپرسیم که آیا میخواهند در مورد عناصر در سطح فضای نام بدانند یا در مورد عناصر در سطوح کلاس/تابع.
برای رسیدن به پاسخ مناسب به این سوال، اجازه دهید به چند تعریفی که سایت MSDN پیشنهاد می کند اشاره کنیم.
در فضای نام | فضای نام خارجی | |
عمومی | دسترسی محدود نیست. | فضای نام خارجی قابل دسترسی |
خصوصی | دسترسی محدود به نوع حاوی است. | خارج از فضای نام قابل دسترسی نیست. |
حفاظت شده | دسترسی به کلاس یا انواع حاوی که از کلاس حاوی مشتق شده اند محدود می شود. | |
درونی؛ داخلی | دسترسی فقط به مونتاژ فعلی محدود است. | در دسترس نیست. |
داخلی محافظت شده | دسترسی به مجموعه فعلی یا انواع مشتق شده از کلاس حاوی محدود است. | خارج از فضای نام، فقط برای انواع مشتق شده از کلاس حاوی قابل دسترسی است. |
تاکنون به این نتیجه رسیده ایم که هر عنصر در سطح فضای نام عمومی یا داخلی است. با این حال، هنوز به بیانیه مشخصی نرسیده ایم.
با این حال، اجازه دهید خارج از مجموعه « CheckAccessModifiers » ببینیم که آیا میتوانیم به عناصر سطح نام دسترسی داشته باشیم.
مراحل:
- ما دو کلاس به نامهای MyCustomClass و MyCustomClass1 در فضای نام CheckAccessModifiers ایجاد کردهایم .
- پروژه را بسازید. یک پروژه کنسول دیگر (در مثال ما OutSideAssembly است) در سطح راه حل ایجاد کنید.
- یک مرجع " OutSideAssembly " را به " CheckAccessModifiers " اضافه کنید.
- شامل فضای نام (با استفاده از CheckAccessModifier)
- در روش Main () سعی کنید به عناصر فضای نام CheckAccessModifiers دسترسی پیدا کنید .
بیایید مثال زیر را ببینیم. در اینجا کلاس دیگری به نام MyCustomClass1 ایجاد کرده ایم و سعی می کنیم به اعضای MyCustomClass دسترسی پیدا کنیم .