خوش آمدید.
تو این ویدیو قراره درباره‌ی structها صحبت کنیم.
و شاید بخوایم بیشتر از یک ویدیو بهشون بپردازیم.
خب، structها خیلی شبیه کلاس‌ها هستن.
اونا تقریباً همه‌ی قابلیت‌های کلاس‌ها رو دارن، اما تو چند جنبه‌ی اصلی و همچنین در نحوه‌ی استفاده، با هم فرق می‌کنن.
خب.
بعداً به structای به اسم DateTime نگاه می‌کنیم، یک struct واقعاً قوی که
به ما اجازه می‌ده از زمان تو برنامه‌مون استفاده کنیم و بدونیم چه تاریخی هست و غیره، که
دونستنش به عنوان یک برنامه‌نویس خیلی مهمه.
اما قبلش، فکر کردم خیلی عاقلانه باشه که اول structها رو ببینیم و بفهمیم چطور کار می‌کنن.
خب، بزرگترین تفاوت بین این دو اینه که structها انواع مقداری (Value Types) هستن،
یعنی روی استک (Stack) ذخیره می‌شن و با مقدار (by value) پاس داده می‌شن، در حالی که کلاس‌ها انواع مرجعی (Reference Types) هستن که
روی هیپ (Heap) ذخیره می‌شن و با مرجع (by reference) پاس داده می‌شن.
بعداً توی یک مثال واقعی می‌بینیم که این به چه معناست، و اون موقع خیلی بیشتر منطقی به نظر میاد،
چون چیزی که الان گفتم خیلی انتزاعیه.
اما وقتی یک مثال واقعی داشته باشیم، خیلی بیشتر منطقی خواهد بود.
structها برای آبجکت‌های کوچیک و سبک مناسبن که به وراثت (inheritance) نیازی ندارن.
این دومین تفاوت بزرگ بین این دو هست.
اوکی، پس structها اجازه‌ی وراثت نمی‌دن.
ولی کلاس‌ها اجازه می‌دن.
پس این‌ها دو تا از بزرگترین تفاوت‌ها هستن.
تفاوت‌های دیگه رو هم خواهیم دید.
اما بریم جلو و یک struct بسازیم تا باهاش آشنا بشیم.
پس یک public struct ایجاد می‌کنم و اسمش رو می‌ذارم Point، اوکی؟
publicش می‌کنم تا بتونم بعداً بهش دسترسی داشته باشم.
و تو این struct قراره دو تا پراپرتی (property) داشته باشم.
پس یکی int x و دیگری int y خواهد بود.
اوکی.
پس فقط این دو تا پراپرتی رو ایجاد می‌کنم.
و بعد structها می‌تونن سازنده (constructor) هم داشته باشن.
پس Ctor.
و این Point به یک int x و یک int y نیاز داره.
و کاری که می‌خوام انجام بدم اینه که x رو برابر x و y رو برابر y قرار بدم.
و structها می‌تونن متد (method) هم داشته باشن، اوکی؟
پس یک struct می‌تونه یک متد public void داشته باشه.
و اسم این متد display (نمایش) خواهد بود.
و کاری که می‌کنه اینه که فقط نقطه‌ی x و y رو نمایش می‌ده.
پس CW و می‌گم dollar sign و "نقطه در" (Point is at).
و بعد موقعیت X و همچنین موقعیت y که با یک کاما و داخل پرانتز از هم جدا شدن.
خب حالا بریم جلو و از structمون استفاده کنیم.
خب، همون روشی رو داره که از یک کلاس استفاده می‌کنیم.
پس می‌ریم جلو و می‌گیم Point، مثلاً P1 new Point.
و بعد می‌بینید که من چیزی رو به سازنده‌ی Point اینجا اضافه نکردم.
اما یک سربار (overload) دیگه وجود داره، اوکی؟
وقتی روش هاور می‌کنید، می‌بینید که یک سربار دیگه وجود داره، به این معنی که یک سازنده‌ی پیش‌فرض (default constructor)
تو یک struct وجود داره.
پس تو مثال ما اینجا Public Point.
می‌بینید، این سربار خودمون یا سازنده‌ی سفارشی خودمون هست که ساختیم و توش یک مقدار X و
یک مقدار y می‌گیریم. > NESA:
و این همون چیزیه که قراره اینجا بذارم.
اوکی.
پس Point P1.
پس می‌تونیم فقط از p1.display استفاده کنیم.
و این به ما اجازه می‌ده هر چیزی رو که داخل اون struct هست نمایش بدیم.
و می‌بینیم که دقیقاً مثل یک متد عادی کار می‌کنه.
نقطه رو روی کنسول می‌نویسه.
اوکی، حالا یک تفاوت دیگه اینه که structها می‌تونن بدون کلمه‌ی کلیدی new تعریف بشن.
پس می‌تونم بگم Point P2، نه new Point، بلکه در واقع فقط وجود داره.
اوکی.
و بعد می‌تونم بگم p2 x قراره 10 باشه و p2 y قراره 20 باشه.
و بعد می‌تونم برم جلو و بگم p2.display.
اگه چیزی که گفتم درسته، که می‌تونیم از structها بدون مقداردهی اولیه با کلمه‌ی کلیدی new استفاده کنیم،
چرا اینجا ارور می‌گیرم؟
و دلیلش اینه که من اینجا دارم از پراپرتی‌ها استفاده می‌کنم.
اگه از فیلدها (fields) استفاده می‌کردم، چیزی که گفتم به طور ایده‌آل کار می‌کرد.
پس بذارید فقط یک مثال بهتون نشون بدم.
پس فقط این رو کپی می‌کنم و اینجا پایین می‌ذارم.
اون‌ها رو کامنت می‌کنم.
و به جای اینکه این یک پراپرتی باشه، یک فیلد خواهد بود.
اوکی.
پس حالا اگه به کدمون نگاه کنیم، می‌بینیم که ارور نمی‌گیریم.
پس تنها چیزی که مهمه اینه که همه‌ی فیلدها باید تو نقطه‌ای که استفاده می‌شن، مقداردهی اولیه بشن.
خب.
تو متد display ما داریم از این فیلدها استفاده می‌کنیم، درسته.
و چون این کار رو می‌کنیم، باید تو اون نقطه مقداردهی اولیه بشن.
این چیزیه که سازنده‌ی ما معمولاً ازش مراقبت می‌کنه، درسته؟
ما فقط گفتیم، اوکی، می‌دونی چیه.
دو تا مقدار رو به ما بده و بعد می‌تونیم ازشون استفاده کنیم.
پس این کاریه که تو این مورد انجام دادیم.
اما تو این مورد می‌بینید که کلمه‌ی کلیدی new وجود نداره.
هیچ مقداردهی اولیه‌ای انجام ندادیم.
و این کار می‌کنه چون همونطور که گفتم، اون دو تا فیلد هستن.
اوکی.
پس این رو اجرا کنیم و ببینیم آیا هنوز کار می‌کنه.
و در واقع کار می‌کنه.
پس ما Point یک و Point دو رو داریم.
اوکی.
حالا نکته‌ی بعدی که می‌خوام نشونتون بدم اینه که structها انواع مقداری (Value Types) هستن.
پس فرض کنید یک Point سه داریم و اسمش P3 هست.
و حالا اون یک new Point نخواهد بود، بلکه P1 خواهد بود.
خب حالا فرض کنید p3 x رو روی 50 سِت می‌کنم.
بعد می‌خوام P1 و P2 یا در واقع تو این مورد P3 رو نمایش بدم.
درسته.
پس بفرمایید.
و خواهیم دید که این Point یک و این Point سه هست.
پس ما جایگزین کردیم.
و نکته‌ی جالب اینه که فقط تونستیم مقادیر رو از Point یک بگیریم.
و 10، 20 بود برای P3.
پس این Point سه هست و حالا 50 هست.
اوکی.
پس مقدار x اون جایگزین شد.
پس ما فقط تونستیم مقدار P1 رو تو P3 انتساب (assign) بدیم.
اینطور نیست که ما واقعاً آبجکت P1 رو به اصطلاح تو P3 قرار داده باشیم.
ما فقط مقادیر رو از P1 به P3 پاس دادیم.
این موضوع وقتی که کلاس‌ها رو هم باهاش مقایسه کنیم، بیشتر منطقی خواهد بود. > NESA:
فکر می‌کنم برای الان کافیه.
بیایید تو ویدیوی بعدی کمی بیشتر به structها بپردازیم.