فکر میکنم برای توضیح کلاس میشه این رو گفت که میاد یک ذهنیتی رو از یک شی تعریف میکنه
مثلا توی همین عکس بالا کلاس ماشین یک کلیت و یک ذهنیت از یک ماشین رو داره بهمون نشون میده.
خوب حالا وقتی که بخوایم از این کلاس (ذهنیت یا تعریف ) بخوایم یه شی بسازیم - یعنی بخوایم یه ماشین( یا همون object) بسازیم ، باید بیایم ازش یک instance یا نمونه درست کنیم که توی C# برای این کار از New استفاده میکنیم
این شکلی:
به صورت کلی با نوشتن ()new Car
از کلاس نمونه درست کردیم ولی خوب این نمونه رو باید توی یه متغییری بریزیم که بتونیم باهاش کار کنیم و ازش استفاده کنیم
Car car = new();
Car car = new Car();
حالا یه نکته ای رو که باید در نظر بگیریم اینه که اینجا Car اولی از سمت چپ خودش یه نوع type داده است که خودمون درستش کردیم و بعدش هم که اسم متغییر هست که قراره instance کلاس Car داخلش قرار بگیره.
حالا یه نکته ای که باید در نظر بگیرید اینه که تا قبل از این که بیایم از کلاسمون instance بگیریم هیچ فضایی رو در مموری اشغال نمیکنه (چون فقط یه ذهنیته) . وقتی که ازش instance گرفتیم میاد در مموری قرار میگیره(چون تبدیل میشه به یک object یا شی) .
مواردی که در کلاس قرار میگیره ایناست:
fields - میزان سوخت
properties - رنگ ماشین
methods - حرکت ماشین - تبدیل سوخت به حرکت
nested classes
حالا نکته ای که هست اینه که یه سری از ویژگی ها میتونن قابل تغییر باشن یه سری هم غیر قابل تغییر اند.
که برای توضیح این موضوع به این نوشته مراجعه کنید.
وقتی که متغییر یا همون filed رو در بالاترین نقطه کلاس قرار بدیم، همه میتونن بهش دسترسی پیدا کنن.
public class car { private string color ='red' }
ایجا همونطور که میبینید اومدیم یه کلاس car تعریف کردیم و داخلش اومدیم یک filed یا همون متغییر رنگ رو تعریف کردیم و بعد برای مقدار پیش فرض رنگ قرمز رو گذاشتیم. ولی دقت کنید که ایجا نوع دسترسی private هستش و این یعنی از خارج کلاس نمشه به این متغییر دسترسی پیدا کرد.
مهم: فیلد ها رو camelCase اسم گذاری میکنیم.
حالا برای این که کلاس ها رو بیشتر بررسی کنیم میایم یه مثال مینویسیم:
اول میایم یه پروژه درست میکنیم به اسم Project
namespace Project { internal class Program { static void Main(string[] args) { Console.WriteLine('Hi') } } }
بعد برای درست کردن کلاس
solution explorer > Project > Add > New Item > Class
بعد میایم یه کلاس Car درست میکنیم:
namespace Project { internal class Car { private string name; private string color; private const int maxSpeed=250; private int speed =0; public bool isLock = false; } }
خوب حالا باید برای استفاده کردن از کلاس کار بیایم ازش یه نمونه درست کنیم:
Car car = new Car();
خوب همونطوری که میبینید فقط متغییر که نوع دسترسیش public بود رو میتونیم ازش استفاده کنیم.
1 و 2 و 3 هم اطلاعاتی هستش که راجع به isLock داره به ما میده که اولی داره میگه که field هستش و بعد تایپش bool هستش و در کلاس car
حالا اگر بخوایم به متغییر name که private تعریف شده دسترسی پیدا کنیم با این ارور مواجه میشیم:
Error CS0122 'Car.name' is inaccessible due to its protection level
نکته ای که وجود داره اینه که ما میتونیم با new هر چند تا که بخوایم از کلاس car نمونه درست کنیم یعنی میتونیم ماشین 1 ، ماشین 2 و ... رو بسازیم. (تنها لیمیت که داریم لیمیت مموری هستش)
حالا به طور مثال اومدیم متغییر speed رو هم public کردیم و این جا سرعت ماشین اولی رو به 120 تغییر دادیم و secondCar رو سرعتش رو به 80 تغییر دادیم.
static void Main(string[] args) { Car car = new Car(); car.isLock = true; car.speed=120; Car secondCar = new Car(); car.speed= 80 ; }
حالا میرسیم به قسمت method یا فانکشن یا همون تابع : که تعریف یک رفتار در یک کلاس هستش. مثلا افزایش سرعت.
یه سری موارد هستش که همین اول بدونیم بهتره. مثل این که ما از متد ها استفاده میکنیم برای این که بیایم یه بار یه کدی رو بنویسیم و بعدا بتونیم چندین بار ازش استفاده کنیم.
متد ها قابلیت این رو دارن که که یه سری دیتا واردشون کنیم که بهشون میگن پارامتر.
متد ها رو فقط زمانی که call میکنید اجرا میشن.
وقتی که از void در تابع ها استفاده میکنیم به این معنیه که این تابع هیچ خروجی نداره
public void myMethod();
زمانی که تابعی که نوشتیم خروجی داشته باشه باید بیایم تایپ نوع خروجی رو براش تعریف کنیم به طور مثال :
برای تابع
f(x) = x + 5;
public int F(int x) { if (x>5) { return x+5; } else { return x+20 } }
توی حالتی که خروجی برای تابع تعریف کردیم حتما باید داخلش حداقل یک پارامتر رو return کنیم.
متد ها رو با PascalCase اسم گذاری میکنیم.
خوب حالا میخوایم یه مثال هم از متد داشته باشیم
حالا میخوام توی کلاس Car بیایم یه متد تعریف کنیم :
public void MyMethod() { for(int i =0; i < speed ; i++) { Console.WriteLine(i); } }
حالا میتونیم از این متد چندین بار استفاده کنیم به این صورت
static void Main(string[] args) { Car car = new Car(); car.isLock = true; car.speed=5; car.MyMethod(); car.MyMethod(); Car secondCar = new Car(); car.speed= 80 ; } خروجی : 0 1 2 3 4 0 1 2 3 4
حالا یه مرحله میریم جلوتر و یه متد دیگه به اسم IncSpeed تعریف میکنیم که سرعت ماشین رو 20 تا بیشتر میکنه :
public void IncSpeed() { speed+=20; } or public void IncSpeed() => speed+=20;
برای دیدن تغییرات speed میایم در کد یه breaking point تعریف میکنیم و در حالت debug کد رو اجرا میکنیم که به تمام متغییرهای فرآیند دسترسی داشته باشیم و ببینیمشون.
خوب همونطور که میبینید بعد از اجرا شدن IncSpeed سرعت ماشین از 5 به 25 تغییر کرد.
نکته جانبی: عکسی که میبینید از برنامه rider هستش که خیلی حجمش کمتره برای دانلود و اجرا. روی سیستم هایی که سخت افزار ضعیف تری دارند بهتر عمل میکنند.
با shortcut F12 میتونیم برسیم به مرجع اون متغییر یا متد یا هر چیزی که روش کلیک کنیم
go to defination
حالا میخوایم این قابلیت رو ایجاد کنیم که مقدار افزایش سرعت رو خودمون تعیین کنیم. برای این کار باید برای تابع IncSpeed یک پارامتر ورودی تعیین کنیم به این شکل:
public void IncSpeed(int sizeInc) { speed+=sizeInc; }
یه مورد دیگه اینه که ما میتونیم به متدمون چندین تا پارامتر ورودی بدهیم.
public void MyMethod(int inc, bool lockCheck, string name) { name = carName; isLock = lockCheck; incSpeed(inc); for(int i =0; i < speed ; i++) { Console.WriteLine(i); } }
حالا برای استفاده کردن ازش باید به این شکل نوشت:
car.MyMethod(50,true,'BMW');
مورد جالبی که وجود داره اینه که فانکشن ها یا متد ها به شکل یک مکعب بنفش نشون داده میشن
کلاس ها هم با رنگ سبز نشون داده میشن
حالا باز هم میخوایم یه مثال دیگه با یه ساختار دیگه تعریف کنیم :
internal class Program { static void Main(string[] args) { MyClass myClass = new MyClass(); myClass.MyMethod2(); } }
حالا یه کلاس جدید به اسم MyClass میسازیم:
public class MyClass { public void MyMethod1(string name,string lastName) { Console.WriteLine($'{name} {lastName}'); } public void MyMethod2() { MyMethod1('ali', 'najafi'); MyMethod1('mohamad', 'jafari'); MyMethod1('soheil', 'mohseni'); } }
حالا اینجا که میخوایم چند تا نکته در دل این این مثال بگیم، یکیش این که ما میتونیم به متغییر های ورودی متد ها یک مقدار پیش فرض بدیم، اینجوری:
public void MyMethod1(string name,string lastName='rezayi')
این جا برای lastName اومدیم مقدار پیش فرض rezayi رو وارد کردیم، یعنی این که اگر کسی فامیلیشو وارد نکنه به صورت پیش فرض ما فامیلیشو rezayi در نظر میگریم
MyMethod1('soheil');
یعنی نتیجه این متد این شکلی میشه:
soheil rezayi
حالا نکاتی که باید اینجا در نظر داشته باشیم اینه که همیشه متغییر هایی رو که میخوایم بهشون مقدار پیش فرض بدیم باید آخر باشن یعنی توی این مثال نمیتونیم اینطوری بنویسیم:
public void MyMethod1(string name='reza',string lastName)
نمیتونیم مقدار اولیه رو با پیش فرض و مقدار دومی رو بدون پیش فرض در نظر بگیریم.
حالا برای این که بخوایم name هم مقدار پیش فرض بگیره باید برای lastName هم مقدار پیش فرض در نظر بگیریم،
public void MyMethod1(string name='reza',string lastName='rezayi')
یه نکته ی دیگه ای که هست اینه که حالا اگر توی این حالت بیایم اسم سبحان رو بنویسیم
MyMethod1('sobhan')
سبحان میاد روی name که از قبل reza بود overwrite میشه و نتیجه میشه :
sobhan rezayi
خوب حالا همونطوری که میبینید برای MyMethod1 مقادیر پیش فرض رو داره بهمون داخل براکت نشون میده [ ] .
باز هم نکته: میتونیم وقتی که داریم متغییر ها رو مینویسیم عنوانش رو هم بنویسیم تا از تداخل های احتمالی جلوگیری کنیم، به طور مثال این جا اومدیم فقط به متغییر lastName مقدار دادیم و name رو به پیش فرض در نظر گرفتیم.
MyMethod1(lastName= ' majidi ' )
reza majidi
مطالب نوشته شده، برداشت من از کلاس C# استاد عمران صادقی هستش. خیلی ممنونم از ایشون به خاطر تدریس عالی که داشتند.