وبلاگ شخصی حامد شیربندی

حامد شیربندی

توسعه دهنده نرم افزار

تفاوت بین field ، property و متغیر (local variable) در #C

پراپرتی (property) ها معمولا اعضای Public یک کلاس هستند و مشخصه ی اصلی آنها Accessor های get  و set است. از دیگر ویژگی های پراپرتی ها هم این است که میتوان آنها را در یک اینترفیس تعریف کرد.

فیلد (field) ها در واقع متغیر (variable) های عضو یک کلاس هستند که به صورت مستقیم در خود کلاس تعریف میشوند و در سطح آن در دسترس هستند. اگر این متغیر ها به صورت مستقیم داخل بدنه یک متد تعریف شوند به آنها local variable گفته میشود.


طبق اصول برنامه نویسی شئ گرا، دنیای خارج از یک کلاس نباید از عملیات صورت گرفته داخل آن کلاس با خبر باشد، برای همین، فیلدها که از مشخصه های یک کلاس هستند معمولا به صورت private تعریف می شودند و هرجا که نیاز باشد دنیای خارج بتواند مقادیر آنها را مشاهده کند و یا تغییری در آنها صورت دهد از پراپرتی ها استفاده میکنیم.

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

حرف اول فیلد ها و متغیر ها را با حروف کوچک و حرف اول پراپرتی ها را با حروف بزرگ مینویسیم.

در اینجا نمونه ای از استفاده ی این اعضا را در یک کلاس مشاهده می کنید :

 public interface IUser
 {
    int Id { get; set; }
    string Name { get; set; }
    void PrintUserInfo();
 }


 public class User : IUser
 {
    //fileds
    private int id;
    private string name;

    //properties
    public int Id
    {
       get { return id; }
       set { id = value; }
    }
    public string Name
    {
      get { return string.IsNullOrEmpty(name) ? "A girl has no name" : name }
       set { name = value; }
    }


  public void PrintUserInfo()
  {
    //local variable
    string toPrint = string.Format("User Id = {0} , User Name= {1}", id, name);
    Console.WriteLine(toPrint);
  }
 }
 class Program
 {
  static void Main(string[] args)
  {
  User user = new User();
  user.Id = 99;
  user.Name = "hamed";
    user.PrintUserInfo();
    Console.ReadKey();
  }
 }

برنامه فوق باعث چاپ خروجی زیر خواهد شد :

User Id = 99 , User Name= hamed


پراپرتی خودکار ( Automatic properties )

زمانی که در سطح کد نیازی به logic بیشتر داخل Accessor های get و set نیست یعنی نیازی نیست داخل get یا set شرط خاصی را بررسی کنیم و عملیات خاصی را انجام دهیم و فقط به شکل ساده میخواهیم با set مقدار فیلد را در پراپرتی قرار داده و با get مقدار فیلد را از پراپرتی بگیریم از شکل ساده ی تعریف یک پراپرتی بدون تعریف هیچ بدنه ای برای get و set استفاده کرده و بدون تعریف فیلد خصوصی به شکل زیر پراپرتی را تعریف میکنیم :


public string Name { get; set; }

با تعریف فوق خود کامپایلر وقتی با این شکل ساده از پراپرتی برخورد میکند در پشت صحنه خودش یک فیلد private برای آن پراپرتی تعریف کرده و get و set را پیاده سازی میکند.به این شکل از تعریف یک پراپرتی ، پراپرتی خودکار ( Automatic properties ) گفته میشود. پراپرتی های خودکار از ویژگی های جدید ارائه شده در سی شارپ 6 هستند. میتوانیم به آنها مقدار اولیه بدهیم و یا با تعریف فقط get ،یک پراپرتی فقط خواندنی داشته باشیم و ...

 

نوشته شده توسط حامد شیربندی

اگر در مورد این نوشته سوال یا ابهامی وجود دارد میتوانید به ایمیل من ارسال کنید. البته در این مورد باید کمی صبور باشید. در آینده بخش نظرات اضافه خواهد شد.