سطح دسترسی در سی شارپ یا Access Modifiers ابزار مهمی برای کنترل سطح دسترسی به اعضا، کلاسها و انواع دادهها هستند. این ابزارها به برنامهنویسان امکان میدهند تا از دستکاری غیرمجاز دادهها و عملکردها جلوگیری کرده و تنها زمانی که لازم است، دسترسی به آنها را فراهم کنند.
در این مقاله از سری مقالات آموزشی پی استور به بررسی انواع مختلف سطح دسترسی در سی شارپ «#Access Modifiers in C» خواهیم پرداخت، از جمله public، private، protected، internal و سایر ترکیبهای آنها. علاوه بر این، نکات مهمی که در هنگام استفاده از این تعدیلکنندهها باید در نظر گرفته شوند، مورد بحث قرار خواهیم داد. این مفاهیم به برنامهنویسان کمک میکنند تا کدهای خود را امنتر و ساختارمندتر طراحی کنند.
مقدمه
Access Modifiers در سیشارپ کلمات کلیدی هستند که دسترسی به یک عضو، کلاس یا نوع داده در یک برنامه را تعریف میکنند. اینها عمدتاً برای محدود کردن دستکاری دادههای ناخواسته توسط برنامهها یا کلاسهای خارجی استفاده میشوند. این تعدیلکنندهها دامنه و میزان دسترسی به کلاسها، متدها، خصوصیات و دیگر اعضا را درون کلاسها یا اسمبلیهای خارجی کنترل میکنند. با استفاده از این تعدیلکنندهها، اطمینان حاصل میکنیم که دادهها یا عملکردهای خاص فقط زمانی که ضروری است در دسترس قرار میگیرند و در غیر این صورت پنهان میمانند.
سطح دسترسی در سی شارپ و دسترسیپذیری
چهار Access Modifiers در سی شارپ (عمومی، محافظت شده، داخلی، خصوصی) وجود دارد که ۶ سطح دسترسی را به صورت زیر تعریف می کنند:
اصلاح کننده ها | کل برنامه | حاوی کلاس | مونتاژ فعلی | انواع مشتق شده | انواع مشتق شده در اسمبلی فعلی |
public | Yes | Yes | Yes | Yes | Yes |
private | No | Yes | No | No | No |
protected | No | Yes | No | Yes | Yes |
internal | No | Yes | Yes | No | Yes |
protected internal | No | Yes | Yes | Yes | Yes |
protected private | No | Yes | No | No | Yes |
۱- سطح دسترسی public در سی شارپ
سطح دسترسی public دسترسی به کل برنامه را فراهم میکند. این به این معنی است که متد یا اسمبلی دیگری که شامل ارجاع به کلاس باشد، میتواند به این اعضا یا انواع دسترسی پیدا کند. این Access Modifiers در سیشارپ بالاترین سطح دسترسی را در مقایسه با سایر تعدیلکنندههای دسترسی دارد.
مثال: کد زیر یک برنامه ساده در زبان برنامهنویسی #C است که با استفاده از یک کلاس به نام Student اطلاعات دانشآموزی مانند شماره دانشآموزی (rollNo) و نام (name) را مدیریت میکند.
using System; class Student { public int rollNo; public string name; public Student(int r, string n) { rollNo = r; name = n; } public int getRollNo() { return rollNo; } public string getName() { return name; } } class Pstore { static void Main(string[] args) { Student S = new Student(1, "ali"); // accessible through another method Console.WriteLine("Displaying using class members"); Console.WriteLine("Roll number: {0}", S.rollNo); Console.WriteLine("Name: {0}", S.name); Console.WriteLine(); Console.WriteLine("Displaying Using methods"); Console.WriteLine("Roll number: {0}", S.getRollNo()); Console.WriteLine("Name: {0}", S.getName()); } }
خروجی
Displaying using class members Roll number: 1 Name: ali Displaying Using methods Roll number: 1 Name: ali
در مثال بالا متغیرهای rollNo و name به صورت public تعریف شدهاند، بنابراین مستقیماً قابل دسترسی هستند. در برنامههای حرفهایتر، بهتر است این متغیرها به صورت private تعریف شده و دسترسی به آنها از طریق متدهای getter و setter انجام شود. برنامه نشان میدهد که میتوان اطلاعات یک شیء را هم به صورت مستقیم و هم از طریق متدها نمایش داد.
۲- سطح دسترسی private در سی شارپ
سطح دسترسی private در سی شارپ دسترسی به اعضای یک کلاس را محدود میکند بهطوریکه تنها خود کلاس میتواند از آنها استفاده کند. اعضای private از خارج از کلاس قابل دسترسی نیستند، حتی توسط کلاسهای مشتقشده.
مثال:
using System; class Parent { private int value; // value is Accessible // only inside the class public void setValue(int v) { value = v; } public int getValue() { return value; } } class Child : Parent { public void showValue() { // Trying to access value // Inside a derived class // Console.WriteLine( "Value = " + value ); // Gives an error } } class PStore { static void Main(string[] args) { Parent obj = new Parent(); // obj.value = 5; // Also gives an error // Use public functions to assign // and use value of the member 'value' obj.setValue(4); Console.WriteLine("Value = " + obj.getValue()); } }
خروجی
Value = 4
در مثال بالا متغیر value به صورت private تعریف شده است، بنابراین فقط در کلاس Parent قابل دسترسی است.
این نوع دسترسی برای پنهانسازی دادهها (Data Encapsulation) استفاده میشود تا کنترل بیشتری روی نحوه دسترسی و تغییر دادهها داشته باشیم.
با استفاده از متدهای public مانند setValue و getValue میتوان به متغیر private دسترسی داشت. این رویکرد ایمنی و انعطافپذیری بیشتری فراهم میکند.
کلاس Child نمیتواند به متغیر value که در کلاس والد Parent به صورت private تعریف شده، دسترسی پیدا کند. اگر بخواهید متغیر value برای کلاسهای مشتقشده نیز قابل دسترسی باشد، میتوانید از سطح دسترسی protected استفاده کنید.
کد بالا نشان میدهد که چگونه میتوان با استفاده از اصول شیءگرایی (OOP) از تغییر مستقیم اعضای داده جلوگیری کرد و یک واسط امن برای تعامل با آنها ارائه داد.
۳- سطح دسترسی protected در سی شارپ
سطح دسترسی protected اجازه میدهد که اعضا در داخل کلاس و توسط کلاسهای مشتقشده (زیرکلاسها) قابل دسترسی باشند. این دسترسی از خارج از کلاس یا کلاسهای مشتقشده مجاز نیست.
مثال: برنامه زیر نشاندهنده استفاده از سطح دسترسی protected و نحوه استفاده از آن در کلاسهای مشتقشده در زبان #C است.
using System; class Student { protected string name; public Student(string studentName) { name = studentName; // Initialize name } } class Program : Student { public Program(string programName) : base(programName) { } public string GetName() { // Access protected member from base class return name; } } class PStore { static void Main(string[] args) { Program obj = new Program("ali"); // Access the protected member through the derived class method Console.WriteLine("The student's name is: {0}", obj.GetName()); } }
خروجی
The student's name is: ali
در مثال بالا متغیر name به صورت protected تعریف شده است، بنابراین فقط کلاس والد (Student) و کلاسهای مشتقشده مانند Program میتوانند به آن دسترسی داشته باشند.
کلمه کلیدی base به سازنده کلاس والد اجازه میدهد تا مقادیر مورد نیاز را مقداردهی کند. این کار باعث میشود که منطق مقداردهی در کلاس والد مدیریت شود.
به دلیل تعریف name به صورت protected، نمیتوان از بیرون کلاس به آن دسترسی داشت. برای دسترسی به مقدار آن، باید از متد GetName استفاده شود که امنیت بیشتری ایجاد میکند.
کلاس Program به عنوان یک کلاس مشتقشده از کلاس Student نشان میدهد که چگونه میتوان از متغیرهای تعریفشده در کلاس والد استفاده کرد.
برنامه بالا به خوبی مفهوم ارثبری و سطح دسترسی protected را نشان میدهد.
۴- سطح دسترسی internal در سی شارپ
این نوع سطح دسترسی در سی شارپ محدود به اسمبلی جاری است، به این معنی که هر کلاس یا نوعی که بهعنوان internal اعلام شده باشد، در هر جایی از همان فضای نام قابل دسترسی است. این تعدیلکننده دسترسی پیشفرض در C# است. این دسترسی زمانی مفید است که بخواهید دسترسی به کدی را که باید فقط در همان پروژه یا کتابخانه استفاده شود، محدود کنید.
مثال: برنامه زیر ویژگی internal در #C را نشان میدهد.
// Inside the file Geeks.cs using System; // Declare class Complex as internal internal class Complex { int real; int img; public void setData(int r, int i) { real = r; img = i; } public void displayData() { Console.WriteLine("Real = {0}", real); Console.WriteLine("Imaginary = {0}", img); } } class PStore { static void Main(string[] args) { // Instantiate the class Complex // in separate class but within // the same assembly Complex c = new Complex(); // Accessible in class Program c.setData(2, 1); c.displayData(); } }
خروجی
Real = 2 Imaginary = 1
۵- سطح دسترسی protected internal در سی شارپ
سطح دسترسی protected internal ویژگیهای protected و internal را ترکیب میکند. این اجازه میدهد که اعضا هم در داخل همان اسمبلی و هم در کلاسهای مشتق شده قابل دسترسی باشند، صرفنظر از اینکه آیا در همان اسمبلی هستند یا خیر.
مثال: در کد زیر، کلاس Parent که در همان اسمبلی ایجاد میکنیم و کلاس دیگری به نام PgS میسازیم که از کلاس Parent دسترسی مییابد. عضو value بهعنوان protected internal اعلام شده است، بنابراین در سراسر کلاس Parent و همچنین در هر کلاس دیگری در همان اسمبلی مانند ABC قابل دسترسی است. همچنین در داخل کلاس دیگری که از Parent مشتق شده است، به نام Child که در اسمبلی دیگری است، قابل دسترسی است.
برنامه ۱:
// Inside file Parent.cs using System; public class Parent { // Declaring protected internal protected internal int value; } class ABC { // Trying to access // value in another class public void testAccess() { // Member value is Accessible Parent obj1 = new Parent(); obj1.value = 12; } }
توجه: این برنامه در همان پوشه است و عضو value در کلاس Parent بهصورت protected internal است و ما میتوانیم آن را در کلاس مشتقشده با استفاده از نمونه کلاس Parent دسترسی پیدا کنیم.
برنامه ۲:
// Inside the file PgS.cs using System; namespace PgS { class Child : Parent { public static void Main(String[] args) { // Accessing value in another assembly Child obj2 = new Child(); // Member value is Accessible obj2.value = 9; Console.WriteLine("Value = " + obj2.value); } } }
خروجی
Value = 9
۶- سطح دسترسی protected private در سی شارپ
دسترسی protected private فقط به کلاس حاوی عضو اعطا میشود. هیچ کلاس دیگری در داخل اسمبلی جاری یا اسمبلیهای دیگر دسترسی به این اعضا نخواهد داشت. این تعدیلکننده در نسخه ۷.۲ و بعدتر #C معتبر است.
مثال:
// illustration of private protected // Accessibility Level using System; namespace PrivateProtectedAccessModifier { class Parent { // Member is declared as private protected private protected int value; // value is Accessible only inside the class public void setValue(int v) { value = v; } public int getValue() { return value; } } class Child : Parent { public void showValue() { // access value // Inside a derived class Console.WriteLine("Value = " + value); // value is accessible } } class Program { static void Main(string[] args) { Parent obj = new Parent(); // obj.value = 5; // Also gives an error // Use public functions to assign // and use value of the member 'value' obj.setValue(4); Console.WriteLine("Value = " + obj.getValue()); } } }
خروجی
Value = 4
نکات مهم سطح دسترسی در سی شارپ
- فضای نامها اجازه استفاده از سطح دسترسی در سی شارپ را نمیدهند، زیرا هیچ محدودیت دسترسی برای آنها وجود ندارد.
- کاربر فقط مجاز است که در هر زمان یک دسترسی را استفاده کند، به جز private protected و protected internal.
- دسترسی پیشفرض برای انواع سطح بالایی (که در انواع دیگر تو در تو نیستند، فقط میتوانند دسترسی public یا internal داشته باشند) internal است.
- اگر برای اعلام یک عضو، هیچ سطح دسترسی در سی شارپ مشخص نشده باشد، دسترسی پیشفرض بر اساس زمینه استفاده میشود.
نتیجه گیری
در نتیجه، سطح دسترسی در سی شارپ ابزارهایی حیاتی برای کنترل و محدود کردن دسترسی به دادهها و عملکردها در یک برنامه هستند. این تعدیلکنندهها به برنامهنویسان کمک میکنند تا دسترسی به اعضای کلاسها و انواع دادهها را مدیریت کرده و امنیت کد را تضمین کنند. با استفاده صحیح از این ابزارها، میتوانیم برنامههایی ایمنتر، با مقیاسپذیری بالا و عملکرد بهتر بسازیم. درک دقیق از انواع مختلف سطح دسترسی در سی شارپ مانند public، private، protected، internal و ترکیبهای آنها، به ما این امکان را میدهد که دسترسیها را بهدرستی تنظیم کرده و از اشتباهات و مشکلات احتمالی در دسترسی غیرمجاز جلوگیری کنیم.