آموزش Visibility (آشکار بودن) در سی شارپ
در سیشارپ، یکی از اصول مهم در برنامهنویسی شیءگرا کنترل دسترسی به اعضای کلاسها و ساختارهاست. این کار با استفاده از سطح دسترسی یا Visibility Modifiers انجام میشود. سطح دسترسی تعیین میکند که چه کدهایی میتوانند به اعضای یک کلاس یا ساختار دسترسی داشته باشند. در این مقاله، به بررسی انواع مختلف سطح دسترسی در سیشارپ میپردازیم.
1.private
سطح دسترسی `private` محدودترین سطح دسترسی است. اعضای `private` فقط در داخل همان کلاس یا ساختار قابل دسترسی هستند و از بیرون هیچ دسترسی به آنها وجود ندارد. این سطح دسترسی معمولاً برای متغیرها و متدهایی که فقط باید در داخل کلاس استفاده شوند، مناسب است.
class MyClass
{
private int myPrivateField;
private void MyPrivateMethod()
{
// Only accessible within MyClass
}
}
2.protected
سطح دسترسی `protected` به اعضای کلاس اجازه میدهد که علاوه بر کلاس خود، در کلاسهای مشتق شده (زیرکلاسها) نیز قابل دسترسی باشند. این سطح دسترسی برای زمانی مناسب است که بخواهید اعضایی را در اختیار کلاسهای فرزند قرار دهید اما از دسترسی مستقیم خارج از سلسله مراتب وراثت جلوگیری کنید.
class BaseClass
{
protected int myProtectedField;
protected void MyProtectedMethod()
{
// Accessible in derived classes
}
}
class DerivedClass : BaseClass
{
void AccessProtectedMembers()
{
myProtectedField = 5; // Accessible
MyProtectedMethod(); // Accessible
}
}
3.internal
سطح دسترسی `internal` اجازه میدهد اعضای کلاس فقط در داخل همان اسمبلی (پروژه) قابل دسترسی باشند. این سطح دسترسی زمانی مفید است که بخواهید اعضا در تمام کدهای موجود در یک پروژه مشترک قابل دسترسی باشند ولی از دسترسی بیرونی جلوگیری شود.
class MyClass
{
internal int myInternalField;
internal void MyInternalMethod()
{
// Accessible within the same assembly
}
}
4.protected internal
ترکیب `protected internal` اجازه میدهد اعضا در داخل همان اسمبلی و همچنین در کلاسهای مشتق شده خارج از اسمبلی قابل دسترسی باشند. این سطح دسترسی میتواند در مواقعی مفید باشد که نیاز به اشتراکگذاری اعضا در یک اسمبلی و همچنین در زیرکلاسهای خارجی دارید.
{
protected internal int myProtectedInternalField;
protected internal void MyProtectedInternalMethod()
{
// Accessible within the same assembly and derived classes outside the assembly
}
}
5.private protected
ترکیب `private protected` اجازه میدهد اعضا فقط در داخل همان کلاس یا کلاسهای مشتق شده در همان اسمبلی قابل دسترسی باشند. این سطح دسترسی محدودتر از `protected internal` است و زمانی استفاده میشود که بخواهید اعضا فقط در محدودهی سلسله مراتب وراثت در همان اسمبلی قابل دسترسی باشند.
class MyClass
{
private protected int myPrivateProtectedField;
private protected void MyPrivateProtectedMethod()
{
// Accessible within the same class and derived classes in the same assembly
}
}
6.public
سطح دسترسی `public` بازترین سطح دسترسی است. اعضای `public` در هر جایی از برنامه قابل دسترسی هستند. این سطح دسترسی معمولاً برای اعضایی که باید در تمام قسمتهای برنامه یا حتی از سایر اسمبلیها قابل دسترسی باشند، استفاده میشود.
class MyClass
{
برنامه نویسی سی شارپ رو قورت بده! بدون کلاس، سرعت 2 برابر، ماندگاری 3 برابر، پولسازی با ساخت اپلیکیشن، توسعه وب ... دانلود:
public int myPublicField;
public void MyPublicMethod()
{
// Accessible everywhere
}
}
مثال کامل از استفاده سطوح دسترسی
در این مثال، نحوه استفاده از سطوح دسترسی مختلف در یک کلاس و دسترسی به آنها از کلاسهای دیگر را مشاهده میکنید:
using System;
namespace AccessModifiersExample
{
class BaseClass
{
private int privateField = 1;
protected int protectedField = 2;
internal int internalField = 3;
protected internal int protectedInternalField = 4;
private protected int privateProtectedField = 5;
public int publicField = 6;
public void ShowFields()
{
Console.WriteLine($"privateField: {privateField}");
Console.WriteLine($"protectedField: {protectedField}");
Console.WriteLine($"internalField: {internalField}");
Console.WriteLine($"protectedInternalField: {protectedInternalField}");
Console.WriteLine($"privateProtectedField: {privateProtectedField}");
Console.WriteLine($"publicField: {publicField}");
}
}
class DerivedClass : BaseClass
{
public void AccessFields()
{
// Console.WriteLine(privateField); // Not accessible
Console.WriteLine(protectedField); // Accessible
Console.WriteLine(internalField); // Accessible within the same assembly
Console.WriteLine(protectedInternalField); // Accessible
Console.WriteLine(privateProtectedField); // Accessible within the same assembly
Console.WriteLine(publicField); // Accessible
}
}
class Program
{
static void Main(string[] args)
{
BaseClass baseObj = new BaseClass();
baseObj.ShowFields();
DerivedClass derivedObj = new DerivedClass();
derivedObj.AccessFields();
// Accessing from outside
Console.WriteLine(baseObj.internalField); // Accessible
Console.WriteLine(baseObj.protectedInternalField); // Accessible
Console.WriteLine(baseObj.publicField); // Accessible
// Console.WriteLine(baseObj.privateField); // Not accessible
// Console.WriteLine(baseObj.protectedField); // Not accessible
// Console.WriteLine(baseObj.privateProtectedField); // Not accessible
}
}
}
نتیجهگیری
کنترل دسترسی در سیشارپ ابزار مهمی برای مدیریت نحوه دسترسی به اعضای کلاسها و ساختارها است. با استفاده از سطوح دسترسی مختلف، میتوان از دسترسی غیرمجاز به اعضای داخلی یک کلاس جلوگیری کرده و کپسولهسازی (encapsulation) را بهبود بخشید. آشنایی با این سطوح دسترسی و نحوه استفادهی صحیح از آنها، نقش مهمی در نوشتن کدهای قابلفهم، امن و نگهداریپذیر ایفا میکند.