خوب حالا میرسیم به قسمت های خیلی جالب C#
ببینید قبل این که برسیم به این که get و set چی هه؟ باید یه سری چیزهایی دیگه رو بگم که اصلا فلسفه ی وجودی get و set از کجا اومده.
بیاید از این جا شروع کنیم، میخوایم یه پروژه بنویسیم و توی اون پروژه یه کلاس به اسم person درست کنیم و بعدش توی اون کلاس یه متغییر Age داریم.
حالا میخوایم یه شرطی بزاریم که کاربر موقعی که Age یا همون سن خودش رو وارد کرد این متغییر چک بشه
به طور مثال سنی که وارد میکنه بین اعداد 1 تا 120 باشه.
خوب برای این که بخوایم این موضوع رو چک کنیم باید چی کار کنیم ؟ خوب باید دسترسی مستقیم رو حذف کنیم و به صورت private بزاریمش، چرا ؟ چون اگر public باشه میتونیم مستقیم و بدون این که سن چک بشه Age رو وارد کنیم.
خوب حالا که Age رو private کردیم فقط از داخل همون کلاس person بهش دسترسی داریم.
حالا باید برای دسترسی خارج از کلاس بیایم برای Age یه متد بنویسیم که بیاید Age رو از کاربر بگیره و بعد چکش کنه ببینه توی اون رنجی که ما میخوایم هست یا نه
public class person { private int Age; public void SetAge(int _age); { if( _age>=1 && _age<120) { Age = _age; } }
حالا اگر بخوایم یه جایی فقط مقدار Age رو بخونیم چی؟
اینجا باید یه متد دیگه هم بنویسیم که فقط مقدار Age رو return میکنه.
public int GetAge() { retrun Age; }
حالا توی Main هم به این شکل ازش استفاده میکنیم:
static void Main(string[] args) { Person person = new Person(); person.SetAge(30); int i = person.GetAge(); }
حالا بعد از این توضیحات میرسیم به get و set چی هه؟ خوب توی C# این امکان وجود داره که به جای این که این مراحل بالا رو بریم برای set کردن و get کردن دیتا از یه راه راحت تر بریم و اون راه راحت تره این شکلیه :
[Access modifire] PropetyType PropertyName{ get { return ... ; } set{ } }
نکته : تمام field ها رو بهتره که private تعریف کنیم و برای دسترسیشون از property استفاده کنیم
حالا بیایم از همین داستان توی یه مثال استفاده کنیم:
public class NewPerson{ private int age; public int Age{ get{ return age; } set{ if(value>1 && value <120){ age = value; } }
حالا شرح ماجرای این کد چیه؟ اینه که خوب ما اول یه کلاس به اسم NewPerson تعریف کردیم بعدش داخلش اومدیم یه متغییر age رو تعریف با دسترسی private حالا میرسیم به قسمت استفاده از property که اول سطح دسترسی شو public در نظر گرفتیم و بعد نوع خروجیش رو بر حسب چیزی که داره return میکنه تعیین کردیم که int هستش.
حالا اگر بخوایم ساده بگیم اینطوری میشه که هر کسی خارج از کلاس NewPerson بخواد به age دسترسی پیدا کنه باید از get استفاده کنه، که اینجا هم get همون مقدار رو برمیگردونه بهش.چجوری؟ اینجوری:
int i = newPerson.Age;
حالا برای set کردن هم مقداری که ما از خارج NewPerson میخوایم برای age بدیم یا همون set کنیم با متغییر value میادش و وارد set میشه، حالا ما اینجا اومدیم و براش شرط گذاشتیم که اگر بین 1 و 120 بود اونموقع میتونه مقدارش رو وارد متغییر age کنیم .
نکته ی جالب انگیز : توی visual studio وقتی میخواد property ها رو نشون بده کنارش یه آچار نشون میده. نکته : property نمیتونه هیچ چیزی رو داخل خودش نگه داره چون حافظه ای نداره، در حقیقت پراپرتی ابزاریه برای این که به قسمتی از حافظه که مقادیر ذخیره شده اند دسترسی پیدا کنیم.
حالا یه سری موارد دیگه هم هستش که باید بدونیم: یکیش اینه که میتونیم هر کدوم از این get یا set رو که نیاز داشتیم بزاریم یعنی میتونیم get یک متغییر رو حذف کنیم اینجوری دیگه نمیتونیم مقدارش رو بخونیم
مورد بعدی اینه که میتونیم سطح دسترسی get و set رو هم تعیین کنیم یعنی به طور مثال سطح دسترسی set رو private در نظر بگیریم ایجوری فقط میتونیم از داخل همون کلاس مقدار اون متغییر رو تغییر بدیم.
مورد بعدی اینه که ما راحت تر هم میتونیم از set , get استفاده کنیم ، اینجوری:
public int Age { get; set; }
اینجا یه آپشن دیگه هم که داره میتونیم مثل بالا برای متغییرمون یه مقدار پیش فرض تعیین کنیم، اینطوری:
public int Age { get; set; }=30;
یه آپشن دیگه هم داریم:
private int age; public int Age{ get => age; set => age = value; }
نکته : اگر پراپرتی رو که داریم تعریف میکنیم فقط get داشته باشه و set رو حذف کنیم اون پارامتر میشه private read only . چرا؟ چون دیگه فقط از طریق constructor میتونیم یه مقداری براش set کنیم و تمام.
یه قابلیت خیلی مهمه دیگه هم هست که باید بدونیم، اینه که میتونیم یه جور دیگه هم از کلاسمون نمونه درست کنیم و بسازیم، چجوری؟
راه قبلی اینطوریه :
public class NewPerson { public string Name{get; set;} public string LastName{get; set;} public int Age{get; set;} public string Role {get; } }
در قسمت Main:
static void Main(string[] args) { NewPerson newPerson = new NewPerson() newPerson.Name = 'soheil' newPerson.LastName= 'moonesi' newPerson.Age = 30; }
خوب حالا اینجا اتفاقی که می افته اینه که وقتی میخوایم
newPerson.Role
رو مقدار بدیم بهمون ارور میده و میگه که این پراپرتی read only هستش و نمیتونی بهش مقدار بدی
حالا اینجا راه حل چیه؟
خوب میتونیم برای این که به یه پراپرتی read only مقدار بدیم بیایم از constructor استفاده کنیم، اینطوری:
public class NewPerson{
public NewPerson(string role){
Role = role }
}
حالا اینجوری موقع ساختن نمونه از کلاس باید یه مقداری رو برای role انتخاب کنیم.
اینجا میرسیم به راه و راه حل جدید :
خوب توی C# این قابلیت رو داریم که به این صورت هم از کلاس نمونه بسازیم:
static void Main(string[] args){ NewPerson newPerson = new NewPerson() { Name = 'soheil', LastName = 'moonesi', Age = 30, } }
حالا ممکنه بگید پس Role چی شد ؟ حالا برای این که بتونیم Role رو از این مدل بهش مقدار بدیم باید قبلش یه چیزی رو به property اضافه کنیم، که اون چیه ؟ init
public string Role { get; init; }
بعد از این که init رو بهش اضافه کردیم میتونیم به Role از این راه مقدار بدیم :
static void Main(string[] args){ NewPerson newPerson = new NewPerson() { Name = 'soheil', LastName = 'moonesi', Age = 30, Role ='scrum master' } }
فقط ویرگول یه باگ عجیبی داره اونم اینه که وقتی که از " استفاده میکنم به جاش معادل حرفش رو میزاره برای همین اینجا از ' استفاده کردم به جاش، ولی درستش " هستش.
مطالب نوشته شده، برداشت من از کلاس C# استاد عمران صادقی هستش. خیلی ممنونم از ایشون به خاطر تدریس عالی که داشتند.