Property یا پراپرتی که به معنای ویژگی است، یکی از ابزارهای مهم و کاربردی در زبان برنامهنویسی سیشارپ است. این ابزار به شما این امکان را میدهد که دسترسی به دادههای داخلی کلاس را مدیریت کنید و در عین حال امنیت و کنترل بیشتری بر روی دادهها داشته باشید. با استفاده از پراپرتیها، میتوانید قواعد خاصی را برای خواندن یا نوشتن مقادیر تنظیم کنید و از دسترسی مستقیم و ناامن به اعضای کلاس جلوگیری نمایید.
این مقاله به بررسی Property در سی شارپ و نحوه استفاده از متدهای get و set برای دسترسی به فیلدهای خصوصی پرداخته است. همچنین انواع ویژگیها «properties»، از جمله ویژگیهای خواندنی، نوشتنی و فقط خواندنی، و نحوه استفاده از آنها به تفصیل توضیح داده شده است. propertyها به توسعهدهندگان این امکان را میدهند که با استفاده از دسترسیهای خاص، برنامههای امنتر و قابلاطمینانتری ایجاد کنند.
مقدمه
پراپرتیها بهطور خاص به ما این امکان را میدهند که بتوانیم بهطور مؤثر و کنترلشده به مقادیر فیلدهای خصوصی دسترسی پیدا کرده، آنها را خوانده یا تغییر دهیم، بدون اینکه نیاز به دسترسی مستقیم به فیلدها داشته باشیم. این پراپرتیها بهعنوان یک لایه میانی بین دادهها و روشهای استفاده از آنها عمل میکنند، که هم انعطافپذیری بیشتری را فراهم میآورد و هم امکان کپسولهسازی «Encapsulation» را در برنامهنویسی شیءگرا بهبود میبخشد.
چرا از Property در سی شارپ استفاده می کنیم؟
قبل از پرداختن به پراپرتیها، بیایید نگاهی بیندازیم به اینکه چرا مفهوم Property وارد #C شد. دلیل این امر دو مورد است:
- اگر اعضای یک کلاس خصوصی باشند، برای اینکه یک کلاس دیگر بتواند به آنها دسترسی پیدا کند یا مقدارشان را تغییر دهد، نیاز به روشی امن و کنترلشده است. در اینجا مفهوم Property وارد عمل میشود. با استفاده از Property، میتوان دسترسی به دادهها را از طریق متدهای get و set کنترل کرد و به این ترتیب از دادههای کلاس به صورت امن استفاده کرد.
- اگر اعضای کلاس عمومی باشند، کلاسهای دیگر میتوانند بهراحتی به آنها دسترسی پیدا کنند و ممکن است از آنها سوءاستفاده کنند. با استفاده از Property، میتوان دسترسی به اعضای داده را محدود کرد و شرایط خاصی برای خواندن و نوشتن دادهها تعیین کرد، بهطوری که فقط در مواقع ضروری و تحت شرایط کنترلشده این کار انجام شود. این مسئله باعث افزایش امنیت و انضباط در کدنویسی میشود.
مثال: قطعه کد زیر نمونهای از مشکلات احتمالی با استفاده از اعضای عمومی «public» و اعضای خصوصی «private» در کلاسها را نشان میدهد.
// C# program to illustrate the problems // with public and private members using System; // public class public class C1 { // public data members public int rn; public string name; // private field // private int marks = 35; } // another public class public class C2 { // Main Method public static void Main(string[] args) { // Creating object of C1 class C1 obj = new C1(); // setting values to public // data members of class C1 obj.rn = 10000; obj.name = null; // setting values to private // data members of class C1 // obj.mark = 0; // display result Console.WriteLine("Name: {0} \nRoll No: {1}", obj.name, obj.rn); } }
خروجی
Name: Roll No: 10000
در مثال بالا میبینید که اعضای عمومی کلاس C1 میتوانند توسط کلاس C2 دسترسی داشته باشند. با استفاده از شیء obj از C1، میتوانیم مقادیر را به اعضا اختصاص دهیم، مانند اینکه مقدار “Name” برابر با null است، اما ما نمیخواهیم این مقدار null باشد. این نشاندهنده این است که اگر اعضای یک کلاس عمومی باشند، هر کلاس دیگر میتواند به آنها دسترسی داشته باشد و تغییراتی اعمال کند.
از سوی دیگر، کلاس C2 نمیتواند مقدار را به عضو marks اختصاص دهد زیرا این عضو در C1 خصوصی است. برای آزمایش دسترسی به اعضای خصوصی، میتوانید کامنتها را حذف کنید و سعی کنید برنامه را اجرا کنید، خواهید دید که کامپایلر خطا میدهد و دسترسی به عضو خصوصی مجاز نخواهد بود.
در زبانهای برنامهنویسی که Property ندارند، معمولاً از متدهای getter و setter برای فراهم کردن چنین مکانیسم دسترسی استفاده میکنند. این متدها به برنامهنویس این امکان را میدهند که با استفاده از روشهایی کنترلشده، دادهها را خوانده یا تغییر دهند و از دسترسی غیرمجاز یا نادرست جلوگیری کنند.
Property در سی شارپ
Property در سی شارپ نوع خاصی از اعضای کلاس هستند که مکانیسم انعطافپذیری برای خواندن، نوشتن یا محاسبه مقدار یک فیلد خصوصی فراهم میکنند. پراپرتیها میتوانند به گونهای استفاده شوند که گویی اعضای دادهای عمومی هستند، اما در واقع متدهای خاصی به نام accessors هستند. این امکان دسترسی به دادهها را به راحتی فراهم میکند و به ارتقای انعطافپذیری و ایمنی متدها کمک میکند. همچنین میتوان از پراپرتیها برای دستیابی به مفهوم کپسوله سازی و مخفیسازی اطلاعات استفاده کرد.
propertyها از متدهای از پیش تعریفشدهای به نام متدهای get و set استفاده میکنند که به دسترسی و اصلاح propertyها کمک میکنند.
Accessors: بلوکهای set و get به عنوان دسترسیدهندهها شناخته میشوند. محدود کردن دسترسی به Property در سی شارپ بسیار مهم است. دو نوع دسترسیدهنده وجود دارد:
- دسترسیدهندههای get
- دسترسیدهندههای set
بر اساس دسترسیدهندههای get و set، پراپرتیها به انواع زیر تقسیم میشوند:
- Propertyهای خواندنی و نوشتنی «Read and Write Properties»: وقتی یک Property شامل هر دو متد get و set باشد.
- Propertyهای فقط خواندنی «Read-Only Properties»: وقتی یک Property فقط شامل متد get باشد.
- Propertyهای فقط نوشتنی «Write Only Properties»: وقتی یک Property فقط شامل متد set باشد.
- Propertyهای خودکار پیادهسازیشده «Auto Implemented Properties»: زمانی که هیچ منطق اضافی در دسترسیدهندههای property وجود ندارد. این property در نسخه ۳.۰ زبان C# معرفی شد.
ساختار یا نحو Property در سی شارپ
در زبان سیشارپ، Property یک روش برای دسترسی و کنترل به ویژگیهای کلاس است. شما میتوانید با استفاده از Property ها به اعضای دادهای یک کلاس دسترسی پیدا کنید، بهطوری که دسترسی به این اعضا میتواند کنترلشده و محدود باشد. ساختار Property در سیشارپ به شکل زیر است:
<access_modifier> <return_type> <property_name> { get { // body } set { // body } }
توضیح اجزای نحو:
- بخش <access_modifier> دسترسی به Property را مشخص میکند. این دسترسی میتواند یکی از موارد public ،private ،protected ،internal باشد.
- <return_type> نوع دادهای است که Property باید برگرداند. این میتواند هر نوع معتبر سیشارپ مانند int، string، double یا حتی انواع پیچیده باشد.
- <property_name> نام Property است که توسط برنامهنویس تعیین میشود.
- get متدی است که مقدار Property را برمیگرداند.
- set متدی است که مقدار جدیدی به Property اختصاص میدهد.
Propertyها میتوانند دارای انواع مختلف دسترسی مانند public، private، protected و internal باشند. دسترسیهای Property در سی شارپ مشخص میکنند که چگونه کاربران کلاس میتوانند به Property دسترسی داشته باشند. متدهای get و set برای یک Property ممکن است دسترسیهای مختلفی داشته باشند. یک Property در سی شارپ میتواند به عنوان یک ویژگی ایستا با استفاده از کلمه کلیدی static اعلام شود یا ممکن است به عنوان یک ویژگی مجازی با استفاده از کلمه کلیدی virtual علامتگذاری شود.
متد Get Accessor: این متد مشخص میکند که مقدار یک فیلد میتواند به صورت عمومی دسترسی پیدا کند. این متد یک مقدار واحد را برمیگرداند و ویژگی فقط خواندنی «readonly» را مشخص میکند.
مثال:
class PStore { // Declare roll_no field private int roll_no; // Declare roll_no property public int Roll_no { get { return roll_no; } } }
متد Set Accessor: این متد مشخص میکند که یک مقدار به یک فیلد خصوصی در یک Property اختصاص یابد. این متد یک مقدار واحد را برمیگرداند و ویژگی فقط نوشتنی «writeonly» را مشخص میکند.
مثال:
class PStore { // Declare roll_no field private int roll_no; // Declare roll_no property public int Roll_no { get { return roll_no; } set { roll_no = value; } } }
دسترسپذیری Accessor در سی شارپ
در سیشارپ، دسترسپذیری یا Accessor به متدهای get و set در Property اشاره دارد که برای خواندن یا نوشتن مقادیر یک Property استفاده میشوند. این متدها میتوانند دارای سطح دسترسی خاصی باشند که رفتار و دسترسی به دادههای کلاس را کنترل میکنند.
نکات کلیدی درباره دسترسپذیری Accessor در سیشارپ
- ما نمیتوانیم از دسترسیهای Accessor در یک رابط «interface» یا پیادهسازی صریح اعضای رابط استفاده کنیم.
- فقط زمانی میتوانیم از دسترسیهای Accessor استفاده کنیم که Property هم متدهای set و هم get را داشته باشد.
- اگر Property دارای اصلاحکنندهی override باشد، اصلاحکننده Accessor باید با دسترسیهای Accessor که بازنویسی شدهاند، مطابقت داشته باشند.
- سطح دسترسی در Accessor باید از سطح دسترسی Property محدودتر باشد.
در ادامه برنامههایی برای نمایش انواع مختلف Propertyها آورده شده است:
استفاده از متد get
برنامه زیر در زبان #C یک نمونه از تعریف ویژگی فقط خواندنی «read-only property» را نشان میدهد.
// C# program to illustrate the // read-only property using System; public class Student { // Declare counter field as cnt private static int cnt; // to define constructor public Student() { // increment the counter // using constructor cnt++; } // Declare counter property public static int Counter { // read-only property get { return cnt; } } } class StudentTest { // Main Method public static void Main(string[] args) { // create three instances of // Student class it call constructor // three times which increase the counter Student s1 = new Student(); Student s2 = new Student(); Student s3 = new Student(); Student s4 = new Student(); // s1.Counter = 10; // Compile Time Error: Can't set value of // Counter because it is read only. Console.WriteLine("Total No of Student: " + Student.Counter); // Program Give Warning // The variable `s1' is assigned but its value is never used } }
خروجی
Total No of Student: 4
ویژگیهای مهم برنامه:
Counter فقط قابل خواندن است و امکان تغییر مستقیم مقدار آن وجود ندارد.
متغیر cnt و ویژگی Counter به صورت ایستا تعریف شدهاند، بنابراین متعلق به کلاس هستند و نه به اشیاء.
اخطاری که در مورد متغیرهای تعریفشده و استفادهنشده داده میشود (The variable ‘s1’ is assigned but its value is never used) به عملکرد برنامه تأثیر نمیگذارد.
استفاده از متد get و set
برنامه زیر نمونهای از ویژگیهای خواندنی و نوشتنی «read-write property» در #C است که از طریق آن میتوان مقادیر یک فیلد را کنترل کرد.
// C# program to illustrate the // read and write property using System; public class Student { // Declare name field private string name = "ProgramStore"; // Declare name property public string Name { get { return name; } set { name = value; } } } class TestStudent { // Main Method public static void Main(string[] args) { Student s = new Student(); // calls set accessor of the property Name, // and pass "PStore" as value of the // standard field 'value'. s.Name = "PStore"; // displays PStore, Calls the get accessor // of the property Name. Console.WriteLine("Name: " + s.Name); } }
خروجی
Name: PStore
نکات کلیدی در مورد پراپرتیهای خواندنی و نوشتنی:
- کپسولهسازی «Encapsulation»: در مثال بالا فیلد name خصوصی است و فقط از طریق پراپرتی Name قابل دسترسی است. این کار کنترل بهتری بر مقداردهی و دریافت مقدار فیلد فراهم میکند.
- انعطافپذیری در مدیریت دادهها: میتوان در دسترسیدهنده set منطق اعتبارسنجی اضافه کرد.
- کاربرد عملی: در پروژههای واقعی، استفاده از Property در سی شارپ به جای فیلدهای عمومی باعث میشود قوانین و منطق خاصی برای دسترسی به دادهها اعمال شود.
نتیجهگیری
Property در سی شارپ ابزار قدرتمندی برای مدیریت دسترسی به دادهها هستند که با استفاده از متدهای get و set به توسعهدهندگان این امکان را میدهند تا دادهها را بهصورت کنترلشده و امن بخوانند و تغییر دهند. این پراپرتیها بهویژه در پیادهسازی انکپسولاسیون و مخفیسازی اطلاعات نقش بسزایی دارند و به توسعهدهندگان این فرصت را میدهند تا طراحی کلاسها و دادهها را بهطور مؤثرتر انجام دهند. با استفاده از دسترسیهای مختلف برای پراپرتیها، میتوان سطح دسترسی و امنیت برنامهها را بهطور دقیق کنترل کرد. در نهایت، استفاده صحیح از پراپرتیها باعث میشود که کدهای نوشتهشده انعطافپذیرتر، ایمنتر و قابل نگهداریتر باشند.