Property در سی شارپ — به زبان ساده همراه با مثال

تصویر شاخص Property در سی شارپ

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‌ها کمک می‌کنند.

تصویری از متد get و set در سی شارپ

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 به توسعه‌دهندگان این امکان را می‌دهند تا داده‌ها را به‌صورت کنترل‌شده و امن بخوانند و تغییر دهند. این پراپرتی‌ها به‌ویژه در پیاده‌سازی انکپسولاسیون و مخفی‌سازی اطلاعات نقش بسزایی دارند و به توسعه‌دهندگان این فرصت را می‌دهند تا طراحی کلاس‌ها و داده‌ها را به‌طور مؤثرتر انجام دهند. با استفاده از دسترسی‌های مختلف برای پراپرتی‌ها، می‌توان سطح دسترسی و امنیت برنامه‌ها را به‌طور دقیق کنترل کرد. در نهایت، استفاده صحیح از پراپرتی‌ها باعث می‌شود که کدهای نوشته‌شده انعطاف‌پذیرتر، ایمن‌تر و قابل نگهداری‌تر باشند.


سوالات متداول


پراپرتی در سی شارپ چیست؟

Property در سی شارپ یک نوع ویژگی است که به شما این امکان را می‌دهد تا به راحتی فیلدهای خصوصی کلاس را از طریق دسترسی‌دهنده‌ها (Accessors) مانند get و set در دسترس قرار دهید. این ویژگی‌ها مانند متغیرها عمل می‌کنند، اما می‌توانند منطق اضافی برای خواندن یا نوشتن داده‌ها داشته باشند.

فرق get و set چیست؟

get: برای دریافت مقدار ویژگی استفاده می‌شود. این اکسسور فیلد خصوصی یا هر محتوای دیگری را که ویژگی به آن اشاره دارد، بازمی‌گرداند. set: برای تعیین مقدار ویژگی استفاده می‌شود. مقدار داده‌شده به ویژگی از طریق کلمه کلیدی value در دسترس قرار می‌گیرد و معمولاً در اینجا فیلد مربوطه به آن اختصاص داده می‌شود.

آیا می‌توان در get و set از عملگرهای دیگر استفاده کرد؟

بله، می‌توانید از هر نوع عملیات در داخل get و set استفاده کنید، از جمله فراخوانی متدها، انجام محاسبات یا اعمال تغییرات روی داده‌ها قبل از بازگشت یا تنظیم مقدار.

چطور از پراپرتی‌ها برای کنترل دسترسی استفاده کنیم؟

با استفاده از پراپرتی‌ها، می‌توانید دسترسی به ویژگی‌ها را به گونه‌ای کنترل کنید که برای برخی عملیات‌ها فقط قابل خواندن و برای برخی دیگر فقط قابل نوشتن باشد. این امکان را می‌دهد که بتوانید محدودیت‌های خاصی در رابطه با دسترسی به داده‌ها اعمال کنید.

آیا می‌توان برای پراپرتی‌ها خصوصیت‌های استاتیک (Static) تعریف کرد؟

بله، می‌توانید پراپرتی‌های استاتیک تعریف کنید که به سطح کلاس تعلق دارند و نه به اشیاء. این پراپرتی‌ها می‌توانند از یک فیلد استاتیک استفاده کنند.

میزان رضایتمندی
لطفاً میزان رضایت خودتان را از این مطلب با دادن امتیاز اعلام کنید.
[ امتیاز میانگین 5 از 7 نفر ]
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع و مراجع:
javatpoint geeksforgeeks مجله پی استور

دیدگاه‌ خود را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *



برچسب‌ها:
سی شارپ


پیمایش به بالا