دوباره خوش اومدی.
توی این ویدیو می‌خوام مطمئن شم که واقعاً تفاوت بین reference type و value type رو درک می‌کنی، باشه؟
همونطور که قبلاً گفتم، structها value type هستن.
اون‌ها reference type نیستن.
classها اما reference type هستن.
خب حالا تفاوتشون چیه؟
بریم ببینیم.
اینجا چی داریم.
یه struct به اسم point داریم با مقدارهای x و y و یه constructor که همین دو تا رو مقداردهی می‌کنه
و یه متد display که فقط این دو مقدار رو نشون می‌ده.
و بعد یه ساختار مشابه هم برای class نوشتم، چون تفاوت اصلی اینه که classها، همونطور که گفتم،
قابل ارث‌بری هستن ولی structها نه.
و همونطور که گفتم، یکی value type هست و اون یکی نه.
پس اینا مهم‌ترین تفاوت‌ها هستن.
و این class هم دقیقاً مثل struct یه X و Y داره.
و مقدارها رو تنظیم می‌کنه و بعد نشونشون می‌ده. خب.
تا اینجا کاملاً شبیه‌ان.
حالا تفاوتشون چطوری مشخص می‌شه.
اینجا یه point1 دارم با مقدار 10 و 20، نشونش می‌دم. بعد یه point2 دارم که برابر point1 هست.
یعنی point1 رو بهش انتساب دادم.
پس p2 الان یه کپی از p1ه.
بعد p2 رو نشون می‌دم و بعد مقدار x مربوط به p2 رو تغییر می‌دم.
یعنی x مربوط به p2 رو می‌ذارم 25.
پس دیگه 20 نیست، شده 25.
اما این تغییر فقط روی p2 تأثیر می‌ذاره، نه p1.
p1 همون 10 و 20 باقی می‌مونه.
پس بذار اول بخش دوم رو comment کنم تا دقیق ببینیم چی می‌شه.
بعد از اون هر دو تا point رو نشون می‌دم.
می‌بینی که point1 هست 10 و 20 و point2 هم 10 و 20ه. اما وقتی مقدار x در p2 رو به 25 تغییر می‌دم،
point1 هنوز 10 و 20ه ولی point2 شده 25 و 20.
خب تا اینجا همه چی منطقیه.
هیچ چیز عجیبی نیست، فقط می‌بینیم که داریم مقدار p1 رو کپی می‌کنیم داخل p2.
یعنی خود مقدارش رو، نه reference به اون مقدار رو.
خب حالا comment رو برمی‌دارم و اجراش می‌کنم تا تفاوت رو ببینی.
اینجا سراغ کلاس‌ها می‌ریم. یه object می‌سازم از کلاس Point به اسم pc1، با مقدارهای 1 و 2.
یعنی تقریباً همون point قبلیه ولی به صورت class.
بعد یه object دیگه می‌سازم.
اسمش رو می‌ذارم pc2.
و مقدارش رو برابر با pc1 قرار می‌دم.
یعنی اینجا pc2 درواقع یه reference به همون objectیه که pc1 بهش اشاره می‌کنه.
یعنی هر دو به یه آدرس حافظه اشاره دارن.
پس هر دو دارن به یه object تو حافظه سیستم اشاره می‌کنن، نه دو تا مختلف.
در نتیجه مقادیر یکی هستن چون مکانشون تو حافظه یکیه.
اما مستقل نیستن، یعنی تغییر یکی روی اون یکی هم تأثیر می‌ذاره.
خب حالا هر دو رو چاپ می‌کنم.
بعد مثل قبل مقدار x مربوط به pc2 رو عوض می‌کنم.
این بار می‌ذارمش 3.
این باعث می‌شه مقدار x در pc1 هم تغییر کنه
چون هر دو به یه object اشاره دارن و هر تغییری روی یکی، توی اون یکی هم منعکس می‌شه.
بعد از اینکه مقدار x رو تغییر دادم، دوباره هر دو رو چاپ می‌کنم.
و وقتی اجرا می‌کنی، می‌بینی که حتی با اینکه فقط pc2 رو تغییر دادیم،
مقدار x در pc1 هم تغییر کرده.
و این دقیقاً همون چیزیه که می‌خواستم بگم، یعنی یکی value type و اون یکی reference typeه.
کلاس‌ها reference type هستن، یعنی به یه object توی حافظه اشاره می‌کنن.
اما structها نه.
structها فقط خودشون یه مقدار دارن.
می‌گن خب من این مقدارو دارم، اگه خواستی یه کپی ازش بگیر.
و تمام.
یعنی به reference اشاره نمی‌کنن.
فقط همون مقدار رو منتقل می‌کنن.
به همین خاطر نمی‌تونی دوتا struct رو راحت با هم مقایسه کنی،
چون فقط می‌تونی بگی آیا مقدارشون یکیه یا نه، نه اینکه آیا خودشون یه object هستن یا نه.
اما برای classها می‌تونی این کارو بکنی.
می‌تونی بگی آیا دو تا object یکی هستن یا نه.
یه متد داریم به اسم equals که هر objectی اون رو داره.
چون همه‌ی classها از object ارث‌بری می‌کنن.
درسته؟
پس می‌تونی بنویسی pc1.equals(pc2) و این یه مقدار bool برمی‌گردونه.
یعنی مثلاً یه متغیر می‌سازی به اسم isEqual.
و بعد نشونش می‌دی روی صفحه.
می‌نویسی "is equal:" به علاوه مقدارش.
خب.
حالا اجراش می‌کنیم.
و باید ببینیم که مقدار true می‌ده.
یعنی اون دوتا object واقعاً یکی هستن.
می‌نویسه "is equal true".
یعنی نشون می‌ده که با وجود اینکه اسم‌هاشون فرق داره، درونشون یکی‌ان.
pc1 و pc2 هر دو دارن
به یه object اشاره می‌کنن که توی حافظه قرار داره.
خب فکر کنم دیگه کاملاً متوجه شدی.
همین بود کل مطلب.
اینم از این ویدیو.
توی ویدیو بعدی می‌بینمت.