در دسامبر 2017، مایکروسافت نسخه C# 7.2 را منتشر کرد و در آن، یک اصلاح کننده دسترسی ترکیبی جدید - Private Protected را معرفی کرد. در حالی که اصلاحکنندههای موجود در جامعه توسعهدهندگان C# بسیار رایج شدهاند، هنوز سردرگمی در مورد محافظت خصوصی وجود دارد. بیایید نگاهی دقیقتر به تمام اصلاحکنندههای دسترسی موجود در سی شارپ به همراه رفتار آنها بیندازیم.
دسترسی به اصلاح کننده ها
Access Modifiers کلمات کلیدی خاصی هستند که در برنامه C# برای تعیین محدوده اعضای کلاس استفاده می شوند. هر اصلاح کننده دسترسی رفتار خاص خود را دارد که برای دستیابی به یک اصل بسیار مهم OOP استفاده می شود. یعنی کپسوله کردن
مقدمه ای بر Private Protected در سی شارپ
با اضافه شدن یک اصلاح کننده دسترسی مرکب جدید در C# 7.2، تعداد اصلاح کننده های دسترسی موجود در C# به 6 می رسد.
با ایجاد یک شی از آن کلاس، میتوان به اعضای عمومی عمومی در هر کجای کلاس یا اسمبلی یا خارج از آن دسترسی داشت .
- اعضای Private
Private محدود به کلاس هستند و حتی با ایجاد شیء آن کلاس نمی توانند به خارج از آن کلاس دسترسی پیدا کنند.
- اعضای محافظت شده
محافظت شده را می توان در آن کلاس یا در کلاسی که آن را مشتق می کند، دسترسی داشت. اما اعضای محافظت شده هرگز با ایجاد یک شی از کلاس قابل دسترسی نیستند. دسترسی به اعضای محافظت شده فقط از طریق وراثت امکان پذیر است.
- اعضای داخلی داخلی
یک کلاس در هر نقطه از اسمبلی که کلاس در آن قرار دارد قابل دسترسی است. ما می توانیم داخلی را به عنوان زیرمجموعه ای از عمومی در نظر بگیریم، یعنی اعضای داخلی به عنوان عمومی عمل می کنند اما فقط در آن مجمع. آنها خارج از آن مجموعه قابل دسترسی نیستند.
- Protected Internal
این اصلاح کننده دسترسی ترکیبی ترکیبی از هر دو Protected و Internal است. اعضای کلاس با این اصلاح کننده دسترسی می توانند در یک کلاس مشتق شده از طریق وراثت یا با ایجاد یک شی یا کلاس پایه قابل دسترسی باشند. اما در یک اسمبلی متفاوت، فقط از طریق ارث می توان به آن دسترسی داشت و نه با ایجاد یک شی.
- Private Protected
این اصلاح کننده دسترسی ترکیبی برای غلبه بر محدودیت های Protected Internal معرفی شده است. در یک اصلاح کننده دسترسی محافظت شده خصوصی، کلاس مشتق شده از اسمبلی مختلف نمی تواند به اعضایی که Private Protected هستند دسترسی داشته باشد.
اگر هر یک از توضیحات بالا برای شما گیج کننده است، نگران نباشید. من رفتار همه اصلاح کننده های دسترسی را از طریق کد زیر نشان داده ام.
چگونه از Private Protected استفاده کنیم؟
لطفاً به خاطر داشته باشید که private protected به نسخه 7.2 C# نیاز دارد. برای انجام این کار،
- روی پروژه خود راست کلیک کنید
- در پایین گزینه های موجود روی Properties کلیک کنید
- بر روی Build کلیک کنید
- روی Advanced کلیک کنید
- در پنجره بازشو، نسخه زبان را برای مطابقت با نسخه مورد نیاز تغییر دهید (7.2)
حالا بیایید نگاهی به کد بیاندازیم.
- // Inside the same assembly
- namespace ConsoleApp1
- {
- public class MyClass
- {
- public void GetPublic() { }
- private void GetPrivate() { }
- internal void GetInternal() { }
- protected void GetProtected() { }
- protected internal void GetProtectedInternal() { }
- protected private void GetPrivateProtected() { }
- }
- class YourClass : MyClass
- {
- MyClass mc = new MyClass();
- public void Show()
- {
- mc.GetPublic();
- //mc.GetPrivate(); Not accessible as private members of a class are not accessible outside class.
- mc.GetInternal();
- //mc.GetProtected(); Not accessible as protected members can be accessed only through inheritance and not by creating an object.
- mc.GetProtectedInternal();
- //mc.GetPrivateProtected(); Not accessible as Private Protected members can be accessed only through inheritance in same assembly.
- GetPublic();
- //GetPrivate(); Not accessible as private members of a class are not accessible outside class.
- GetInternal();
- GetProtected();
- GetProtectedInternal();
- GetPrivateProtected();
- }
- }
- }
- //Outside the assembly
- using ConsoleApp1;
- namespace ClassLibrary1
- {
- public class YourClass : MyClass
- {
- MyClass mc = new MyClass();
- public void show()
- {
- mc.GetPublic();
- //mc.GetPrivate(); Not accessible as private members of a class are not accessible outside class.
- //mc.GetInternal(); Not accessible as internal members are not accessible outside it's assembly.
- //mc.GetProtected(); Not accessible as protected members can be accessed only through inheritance and not by creating an object.
- //mc.GetProtectedInternal(); Not accessible as Protected Internal members can not be accessed outside of assembly by creating an object.
- //mc.GetPrivateProtected(); Not accessible as Private Protected members are not accessible outside of assembly by creating an object or through inheritance.
- GetPublic();
- //GetPrivate(); Not accessible as private members of a class are not accessible outside class.
- GetProtected();
- //GetInternal(); Not accessible as internal members are not accessible outside it's assembly.
- GetProtectedInternal();
- //GetPrivateProtected(); Not accessible as Private Protected members are not accessible outside of assembly by creating an object or through inheritance.
- }
- }
- }
نتیجه
امیدوارم توانسته باشم رفتار همه اصلاح کننده های دسترسی را همراه با Private Protected نشان دهم و این مقاله به شما برای درک بهتر مفهوم کمک کند. بازخورد شما همیشه مورد استقبال قرار می گیرد.