💻 آخرین فرصت یادگیری برنامه‌نویسی با آفر ویژه قبل از افزایش قیمت در ۵ آذر ماه (🎁 به همراه یک هدیه ارزشمند )
۰ ثانیه
۰ دقیقه
۰ ساعت
۲ حمیدرضا جلیلی
function get & set
جامعه ASP.NET ایجاد شده در ۱۱ دی ۱۴۰۱

سلام یه موضوع برام خوب جا نیفتاده ما گاهی مجبوریم که یه فیلدی رو پرایوت تعریف کنیم تا توسط متغیرهای دیگه در کلاس‌های دیگه دستکاری نشه تا برنامه به مشکل نخوره در حالیکه خب تو همون کلاس‌ها میتونن با متغیر‌های پابلیک تعیف شده و متد‌های Get , set همون متغیرهای رو تغییر بدن خب چه فرقی میکنه؟ بالاخره که تغییرش میدن که ؟

و اینکه برنامه در کد زیر (تعریف property , field)چطور و با چه منطقی هر دو این‌ها رو یکی در نظر میگیره یعنی تغییر در متده ی get , set رو روی فیلد پرایوت اعمال میکنه؟ آیا به خاطر روش نامگذاری این اتفاق میفته؟

 private static int _id = 1;

    public int Id { get; set; }

سلام،

با getter و setter مفهومی بنام Encapsulation رو پیاده سازی میکنید.

با اینکار دیگه بطور مستقیم چیزی فراخوانی یا ست نمیشه و یک سری قوانین یا فرمت تعیین میکنیم تا فیلدمون رو بدون نگرانی در قسمت‌های مختلف کد استفاده کنیم. اگر یک مثال ساده بخوام بیارم، شما فرض کن فیلدی به عنوان قیمت یک محصول دارم(price). امروز که کدنویسی میکنم همه چیز بر اساس تومان هست و من این فیلدو براساس تومان مقدار دهی میکنم و قسمت‌های مختلفی از کد فراخوانی میکنم. مثلاً:

class Product
{
  	public int price; // field
    
    // anything can be written
}

بعد در قسمت‌های مختلفی از پروژه من قیمت هارو چاپ میکنم:

Product note6 = new Product();
note6.price = 1000;
Console.WriteLine("قیمت این محصول: " + note6.price + " تومان");
      
Product note7 = new Product();
note7.price = 2000;
Console.WriteLine("قیمت این محصول: " + note7.price + " تومان");
      
Product note8 = new Product();
note8.price = 3000;
Console.WriteLine("قیمت این محصول: " + note8.price + " تومان");

بعد از کدنویسی دیده میشه مشتری‌ها اعتراض میکنن که بعضا تصورشون این بوده قیمت برحسب ریال هست و اقدام به خرید کردن و داخل درگاه بانکی هم توجهی به قیمت نکردن و شما تصمیم میگیری قیمت هارو برحسب ریال کنی. اتفاقی که میوفته شما باید تمام قیمت هایی که بصورت hard code تومان رو قرار دادید عوض کنید و ریال کنید، بجای اینکار میاید از getter و setter استفاده میکنید تا داخل setter فرمولی برای درج قیمت در نظر بگیری و کنترل کنی و برای getter هم مشخص میکنی چه چیزی خروجی داشته باشه، بنابراین فیلدو پرایویت میکنی تا دسترسی مستقیم نباشه:

class Product
{
    private int _price;  // field
    
    public void setPrice(int value)
    {
        _price = value * 10;
    } 
    
    public string getPrice()
    {
        return  _price + " ریال";
    }  
}
//================//
Product note6 = new Product();
note6.setPrice(1000);
Console.WriteLine("قیمت این محصول: " + note6.getPrice());
Product note7 = new Product();
note7.setPrice(2000);
Console.WriteLine("قیمت این محصول: " + note7.getPrice());
Product note8 = new Product();
note8.setPrice(3000);
Console.WriteLine("قیمت این محصول: " + note8.getPrice());

مفهوم کپسوله سازی رو با فیلد و متد مثال زدم شما میتونی با پراپرتی تصور کنید تفاوتی نمیکنه در عمل هر دوروش مفهوم Encapsulation پیاده خواهد شد.

این یک مثال ساده بود که در عمل ساختارهای متفاوتی پیاده خواهید کرد. مهم درک مفهوم خواهد بود که هیچ کجا فیلد هارو بصورت مستقیم دسترسی ندید. در مورد کپسوله سازی سرچ کنید تا مثال‌های بیشتری ببینید.

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


در مورد سؤال دومتون فیلد _id و پراپرتی Id یکی نیستن، پراپرتی Id میتونه هر اسمی داشته باشه، مثلا PropertyId باشه اسمش. شما هر اسمی بگذارید اونطرف خارج از کلاس بهمین اسم صداش خواهید زد و زمانی که داخل () مقداری بعنوان پارامتر بدید در حالت ست قرار داره.

بهترین پاسخ
محسن موحد ۱۱ دی ۱۴۰۱، ۱۸:۵۹

تشکر

حمیدرضا جلیلی ۱۳ دی ۱۴۰۱، ۰۷:۰۷