در قسمت دوم آموزش شی گرایی در ادامه آموزش اول درباره Proeperty ها که نقش مهمی در شی گرایی دارند بیشتر صحبت میکنیم.
پروپرتی ها یا خصوصیات کلاس ها کار را برای ما خیلی راحت کردند بدین صورت که چنین مزیت دارند یکی اینکه به طور مستقیم میتوان به فیلد های کلاس دسنرسی پیدا کنیم و دیگری اینکه دیگر نیازی به استفاده از دستوراتی مانند write , read در بدنه کلاس نمیباشد و این ویژگی خیلی مهم میباشد بدین دلیل که شاید ما بخواهیم از فایل کلاس در سیستمی دیگر یا حتی با زبان و ورژنی دیگر از هر زبان استفاده کنیم و ممکن است زبان جدید از این سری دستورات پشتیبانی نکند به همین دلیل از پروپرتی ها ساتفاده میکنیم تا دستورات اینچنین را درون بدنه main قرار دهیم با هر زبانی اما بدنه کلاس را بتوانیم با همه زبان ها وقف دهیم.
شکل کلی پروپرتی ها بدین صورت میباشد
private int myVar; public int MyProperty { get { return myVar; } set { myVar = value; } }
در ابتدا که یک فیلد در کلاس ایجاد شده سپس برای آن فیلد پروپرتی با نام MyProperty (یا هر نام دیگری) و با نوع int در واقع نوع پروپرتی باید هم نوع متغیری باشد که میخواهیم این پروپرتی را به آن اختصاص دهیم سپس دو قسمت get , set درون بدنه آن وجود دارد که قسمت get درواقع مقدار درونی متغیر مربوطه را برمیگرداند با استفاده از دستور return و قسمت set مقداری را توسط دستور ضمنی value به متغیر میدهد.
میتوان این بدنه را با تایپ کردن عبارت propfull و سپس فشردن دوبار کلید tab ایجاد کرد یا به صورت دستی تایپ کرد.
ما تکه کد زیر را به قسمت کلاس برنامه اضافه کرده ایم
double price; public double _price { get { return price; } set { price = value; } }
که همانگونه که مشخص است شی price و پروپرتی برای آن با نام _price ایجاد شده و سپس قسمت main برنامه را چنین تغییر داده ایم
static void Main(string[] args) { Product obj = new Product(); Product obj2 = new Product(); obj.Name = "T-shirt"; obj._price = 15000; obj2.Name = "Socks"; obj2._price = 25000; obj.str(); Console.WriteLine(obj.Name +" " + obj._price); obj2.str(); Console.WriteLine(obj2.Name +" " + obj2._price); Console.ReadKey(); }
static void Main(string[] args) { Product obj = new Product(); Product obj2 = new Product(); obj.Name = "T-shirt"; obj._price = 15000; obj2.Name = "Socks"; obj2._price = 25000; obj.str(); Console.WriteLine(obj.Name +" " + obj._price); obj2.str(); Console.WriteLine(obj2.Name +" " + obj2._price); Console.ReadKey(); }
که تغییر چندانی ایجاد نشده تنها مقدار پروپرتی price_ هر دو شی را مقدار دهی کرده ایم و انهارا در خروجی چاپ کرده ایم.
حتی میتوان درون پروپرتی ها شرطی قرار داد تا در هنگام وارد کردن مقداری درون آن فیلدها مقدار را بررسی کرده و براساس خواسته برنامه نویس عکس العمل نشان دهد برای مثال ما شرطی درون پروپرتی مربوط به فیلد price قرار میدهیم بدین صورت که اگر مقدار این فیلد کمتر از ۱۶۰۰۰ باشد عبارت off را نیز در ادامه مشخصتاش چاپ کند پس درون کلاس کدها را بدین صورت تغییر خواهیم داد.
public double _price { get { return price; } set { if (value > 16000) { price = value; } else { Console.Write("off "); price = value; } } }
چون در هنگام مقدار دهی میخواهیم مقدار وارد شده را چک کند پس درون قسمت set شرط مورد نظر را تایپ میکنیم حال با اجرا برنامه خروجی زیر را خواهیم داشت
این گونه از پروپرتی ها نیازی به Back Field ندارد که در این شرایط سرعت کار بالا میرود اما نتیجه را نمیتوان جایی ذخیره کرد و از دست میرود که در شرایطی حتما به Back Field نیاز است برای داشتن نتیجه در حالی که در شرایطی نیز نتیجه کار مهم نیست و فقط سرعت مدنظر است.
برای مثال تکه کد زیر
public int Brand { get; set; }
در شبه کد فوق هیج فیلدی مربوط به این پروپرتی در کلاس وجود ندارد اما همانگونه که مشاهده میکنید میتوان اینچنین پروپرتی ایجاد کرد.